首页 > 其他分享 >P5901 [IOI2009] Regions

P5901 [IOI2009] Regions

时间:2023-12-16 21:22:19浏览次数:34  
标签:IOI2009 P5901 le 委员 int sqrt Regions mathcal 导师

[IOI2009] Regions

Luogu P5901

题目描述

联合国区域发展委员会(The United Nations Regional Development Agency, UNRDA)有一个良好的组织结构。它任用了 \(N\) 名委员,每名委员都属于几个地区中的一个。委员们按照其资历被编号为 \(1\) 到 \(N\) ,\(1\) 号委员是主席,资历最高。委员所属地区被编号为 \(1\) 到 \(R\)。除了主席之外所有委员都有一个直接导师。任何直接导师的资历都比他所指导的委员的资历要高。

我们称委员 \(A\) 是委员 \(B\) 的导师当且仅当 \(A\) 是 \(B\) 的直接导师或者 \(A\) 是 \(B\) 的直接导师的导师。显然,主席是所有其他委员的导师,没有任何两名委员互为导师。

现在,为了调查大量对 UNRDA 偏向某些地区的不平衡的组织结构的指控,UNRDA 想要建立一个计算机系统:在给定委员之间的直接导师关系的情况下,该系统可以回答下述形式的问题:给定两个地区 \(r_1\) 和 \(r_2\),要求系统回答委员会中有多少对委员 \(e_1\) 和 \(e_2\),满足 \(e_1\) 属于 \(r_1\),而 \(e_2\) 属于 \(r_2\),并且 \(e_1\) 是 \(e_2\) 的导师。每次询问都有两个参数 \(r_1\) 和 \(r_2\),结果是一个整数:满足上述条件的 \((e_1, e_2)\) 二元组的数量。

任务:编写一个程序,给定每个委员的地区和直接导师,在线 回答上述询问。

强制在线将以交互的格式进行

  • 对于 \(30\%\) 的数据,\(N\leq 500\)。
  • 对于 \(55\%\) 的数据,没有地区包含超过 \(500\) 个委员。
  • 同时满足上述两个条件的数据有 \(15\%\),至少满足上述一个条件的数据有 \(70\%\)。
  • 对于 \(100\%\) 的数据,\(1 \le N, Q \le 2 \times 10^5\),\(1 \le H_k, r_1, r_2 \le R \le 2.5 \times 10^4\),\(1 \le S_k < k\)。

Solution

先尝试去想暴力,很容易想到两种不同的暴力做法:

  • 分别枚举两个颜色中的所有点,利用 Dfs 序判定一个点是否在另一个点的子树内。
  • 将一个颜色内的所有点先加入到一个数据结构内,然后枚举另一个颜色的所有点,查看有多少点在当前子树。

第一种做法时间最劣是 \(\mathcal O(n^2)\) 的,第二种做法空间最劣是 \(\mathcal O(n^2)\) 的。考虑综合一下这两种做法。使用根号分治,按照颜色的点数进行根号分治。将点数在阈值之上的称为重颜色,否则称为轻颜色。分类讨论一下:

  • 重颜色作为祖先节点:不妨预处理所有重颜色作为祖先节点的情况的答案,容易做到 \(\mathcal O(n\sqrt {n\log n})\) 时间预处理,\(\mathcal O(R\sqrt n)\) 空间。
  • 轻颜色作为祖先节点:枚举轻颜色内的所有点,然后对于每个颜色开一个 vector 按照 Dfs 序将所有点排序就可以直接二分找到所有满足条件的子节点,时间可以做到 \(\mathcal O(n\sqrt{n\log n})\)。

总时间复杂度 \(\mathcal O(n\sqrt {n\log n})\),空间复杂度 \(\mathcal O(R\sqrt n)\)。

Code
#include <bits/stdc++.h>
#define All(x) x.begin(), x.end()
using namespace std;
constexpr int _N = 2e5 + 5, _B = 450 + 5, _R = 2.5e4 + 5;
int N, R, Q, Lim;
vector<int> e[_N];
int f[_B][_R], dfn[_N], cnt[_N], ord, id[_N], siz[_N], di[_N], d[_N];
vector<int> vec[_N], vdfn[_N];
void Dfs(int x) {
    dfn[x] = ++ord, siz[x] = 1;
    for (int v: e[x]) Dfs(v), siz[x] += siz[v];
}
signed main() {
    cin >> N >> R >> Q;
    Lim = sqrt(N * log2(N) * 2);
    for (int i = 1; i <= N; ++i) {
        if (i != 1) {
            int fa; cin >> fa;
            e[fa].push_back(i);
        }
        int col; cin >> col;
        vec[col].push_back(i);
        ++cnt[col];
    }
    iota(id + 1, id + R + 1, 1);
    sort(id + 1, id + R + 1, [&](const int &i, const int &j) {
        return cnt[i] > cnt[j];
    });
    Dfs(1);
    for (int i = 1; i <= R; ++i) {
        di[id[i]] = i;
        for (int x: vec[i]) vdfn[i].push_back(dfn[x]);
        sort(All(vdfn[i]));
    }
    for (int i = 1; i <= R; ++i) {
        if (cnt[id[i]] < Lim) break;
        for (int i = 1; i <= N + 1; ++i) d[i] = 0;
        for (int x: vec[id[i]]) ++d[dfn[x]], --d[dfn[x] + siz[x]];
        partial_sum(d, d + N + 1, d);
        for (int j = 1; j <= R; ++j) for (int x: vec[j])
            f[i][j] += d[dfn[x]];
    }
    while (Q--) {
        int r1, r2; cin >> r1 >> r2;
        if (cnt[r1] < Lim) {
            int res = 0;
            for (int x: vec[r1])
                res += upper_bound(All(vdfn[r2]), dfn[x] + siz[x] - 1) -
                       lower_bound(All(vdfn[r2]), dfn[x]);
            cout << res << endl;
        } else cout << f[di[r1]][r2] << endl;
    }
}

标签:IOI2009,P5901,le,委员,int,sqrt,Regions,mathcal,导师
From: https://www.cnblogs.com/hanx16msgr/p/17908395.html

相关文章

  • Paper Reading: Oversampling with Reliably Expanding Minority Class Regions for I
    目录研究动机研究背景研究目的文章贡献本文方法可靠的扩展少数类区域的过采样方法描述方法分析多分类的OREM-MOREM和Boosting的结合计算复杂度实验结果二分类数据集实验实验设置对比实验消融实验调参实验多分类数据集实验对比实验消融实验OREMBoost实验实验设置对比实验优点......
  • [题解] P5901 [IOI2009] Regions
    P5901[IOI2009]Regions给你一棵树,每个点有颜色\(h_i\)。多次询问,每次询问有多少对\((u,v)\)满足\(u\)是\(v\)的祖先且\(u\)的颜色是\(r_1\)且\(v\)的颜色是\(r_2\)。\(n,q\le2\times10^5,h_i\le2.5\times10^4\)。总颜色数一定,考虑对颜色的出现次......
  • P4850 [IOI2009] Raisins 题解
    前言:IOI还出这样水的纯记忆化搜索题?还是T4?真令人难以置信。题意:题目传送门一个N×M的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成1×1的方格,求最小的分割总价值之和。思路:看到这是个最优化的题,且数据范围很......
  • 大数据面试题:HBase的RegionServer宕机以后怎么恢复的?
    可回答:1)HBase一个节点宕机了怎么办;2)HBase故障恢复参考答案:1、HBase常见故障导致RegionServer故障的原因:FullGc引起长时间停顿HBase对Jvm堆内存管理不善,未合理使用堆外内存Jvm启动参数配置不合理业务写入或吞吐量太大写入读取字段太大HDFS异常读取写入数据都是直接操作hdfs的,若hdfs......
  • surrounded-regions
    Givena2Dboardcontaining'X'and'O',captureallregionssurroundedby'X'.Aregioniscapturedbyflippingall'O'sinto'X'sinthatsurroundedregion.Forexample,XXXXXOOXXXOXXOXXAft......
  • 解决eclipse+myeclipse的Processing Dirty Regions错误
    http://www.javaeye.com/topic/192152我的Eclipse3.3.2+MyEclipse6.0.1在打开JSP文件时出现以下错误:Aninternalerroroccurredduring:"ProcessingDirtyRegions".org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidationHelperAninternalerro......
  • UVA1392 DNA Regions
     https://www.luogu.com.cn/problem/UVA1392给定两个长度为n的字符串A和B,满足A和B都只由大写字母A、C、G、T组成。求一个长度最长的闭区间[L,R],满足对于i∈[L,R], 有不超过p%的i满足Ai≠Bi ......
  • 面试题百日百刷-HBase HRegionServer宕机如何处理
    锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步!接下来的是今日的面试题: 1.HBase......
  • BZOJ #3353. [IOI2009] Archery
    这是一篇大概和题解不一样的做法。首先一个平凡的转化是将我们要操作的这个数看作\(0\),大于这个数的看作\(1\),小于的看作\(-1\),则原来的\(2n\)个数转化成对\(3\)......
  • P5902 [IOI2009] salesman 题解
    题目链接题意船向上游移动1米花费\(U\)元,向下移动1米花费\(D\)元。沿河有\(N\)个展销会,对于第\(i\)个展销会,它的日期为\(T_i\),它的位置为\(L_i\),可获得盈......