Description

恶梦是学校里面的学生会主席。他今天非常的兴奋,因为学校一年一度的学生节开始啦!!
在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演。其中第i个节目的表演时间为第i个单位时间,表演的舞台为Ai,注意可能有多个节目使用同一个舞台。
作为恶梦的忠实粉丝之一的肥佬,当然要来逛一下啦,顺便看一下能不能要到恶梦的签名。
肥佬一开始会先在A1 看完节目1再去闲逛。
肥佬可以在舞台之间随便乱走。但是假如肥佬当前在看第i个节目,站在第Ai个舞台前面的话,由于有些道路被封锁了,所以肥佬下一步只能前往第Li到第Ri个舞台中的一个。并且当一个节目结束的时候,肥佬只能去看另外一个节目,或者结束自己的闲逛。
具体而言就是说,假设肥佬可以从第i个节目走去第j个节目,那么当且仅当i<j且Li <= Aj <= Ri。
但事实上是,恶梦非常讨厌被自己的粉丝跟踪。所以他想在只封锁掉一个节目的情况下,使得肥佬不能到达自己所在的地方。并且为了防止意外,他还想知道有多少个这样的节目。
简而言之,恶梦想知道对于任意一个节目p∈[1,N],有多少个节目t,使得删掉t之后,不存在一条从节目1出发到节目p的路径。注意,节目1和节目p也是可以被删的。
由于他非常的忙碌,所以他把这个任务交给了你。

Input

第一行包括一个正整数N,表示总共有N个节目。
第二行包括N个正整数Ai,表示第i个节目占用了第Ai个舞台。
接下来的N行,第i行包括两个正整数Li,Ri,表示第i个节目的路径限制。

Output

总共N行。第i行包括一个整数c,表示当恶梦站在第i个节目的时候,有多少个满足要求的节点。
特别的,若一开始就不存在从1出发到i的路径的话,你需要输出-1.

Sample Input

101 6 1 8 7 2 3 9 10 105 82 41 29 108 99 910 102 22 49 9

Sample Output

12-12233222

Data Constraint

对于15%的数据,N <= 100
对于30%的数据,N <= 800
对于50%的数据,N <= 5000
对于70%的数据,N <= 10000
对于100%的数据,N <= 50000

Hint

样例解释:
我们假如将一个节目视为一个节点的话,按题意所述,我们可以构造出一副有向图。

设对于点i,他可选的删除集合为Si
那么很直观的就可以看出来:
对于1号节点,S1 = {1}
对于2号节点,S2 = {1,2}
对于3号节点,由于本来就不存在1到3的路径,所以应输出-1
对于4号节点,S4 = {1,4}
对于5号节点,S5 = {1,5}
对于6号节点,S6 = {1,2,6}
对于7号节点,S7 = {1,2,7}
对于8号节点,S8 = {1,8},5号点和6号点都不是合法的点。
对于9号节点,S9 = {1,9}
对于10号节点,S10 = {1,10}

题解

  • 题目大意:给定一个DAG,问从1到每个点必经点的个数
  • 30%的数据,强行建图,强行跑,O(n^3)
  • 我们先引入一个东东,叫支配树
  • 支配树简单点来说其实就是求有向图中每个点的必经点个数的有效方法,这题中DAG是一个有向无环图,满足支配树的要求。设idom[i]表示从s到i最近的必经点,dom[i]表示从s到i的必经点的集合
    那么对于每个点i,它的idom和dom都是唯一的,这样的话就会构成一棵树,这棵树就是所谓的Dominator tree,也就是支配树。dom[i]也就是i点在这棵树上所有祖先的集合
    考虑如何求idom数组,然后我们可以发现,对于i点,只能有一个点到达,那么这个可以到达的点就一定是它的idom;若该点有多个点可以到达,那么其实就是这多个点的lca
    然后,每个点的必经点的个数,其实就是在支配树中的深度(可以想想为什么)
    这样的话,我们就能一遍拓扑排序,一边求lca,时间复杂度为O((N + E)log N), N为图中的点数,E为图中的边数

  • 这个东东说完了,那么怎么做呢,先来看看75分滴
  • 75%,对于这档数据,我们可以很暴力的去做,先记录下每个点的入度,然后拓扑排序,用倍增建边,直接跑lca就好了
  • 但是这个东东,时间复杂度是过不去的,建边太暴力了,严重影响时间复杂度,那么我们就可以考虑用数据结构来优化建边,然后就有了100分的做法
  • 100%,我们可以用线段树来维护每个点的idom(最近的必经点),然后用线段树的方式建边,也是倍增跑lca,最后本题的时间复杂度为O((NlogN)log (NlogN))
  • 此题完结(撒花)^_^

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #define N 50010
 5 using namespace std;
 6 int n,m,o,a[N],tree[N*3],f[N][20],dep[N];
 7 int LCA(int x,int y)
 8 {
 9     if (!x&&!y) return 0; if (!x||!y) return x+y;
10     if (dep[x]<dep[y]) swap(x,y);
11     if (dep[x]!=dep[y]) for (int i=log(n)/log(2);i>=0;i--) if (dep[f[x][i]]>=dep[y]) x=f[x][i];
12     if (x==y) return x;
13     for (int i=log(n)/log(2);i>=0;i--) if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
14     return f[x][0];
15 }
16 int getlca(int d,int l,int r,int k)
17 {
18     if (l==r) return tree[d];
19     int mid=l+r>>1;
20     if (k<=mid) return LCA(tree[d],getlca(d*2,l,mid,k)); else return LCA(tree[d],getlca(d*2+1,mid+1,r,k));
21 }
22 void change(int d,int l,int r,int L,int R,int k)
23 {
24     if (l==L&&r==R) { tree[d]=LCA(tree[d],k); return; }
25     int mid=l+r>>1;
26     if (R<=mid) change(d*2,l,mid,L,R,k); else if (L>mid) change(d*2+1,mid+1,r,L,R,k); else change(d*2,l,mid,L,mid,k),change(d*2+1,mid+1,r,mid+1,R,k);
27 }
28 int main()
29 {
30     scanf("%d",&n),dep[1]=1;
31     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
32     for (int i=1,l,r;i<=n;i++)
33     {
34         scanf("%d%d",&l,&r),o=1;
35         if (i>1)
36         {
37             int lca=getlca(1,1,n,a[i]);
38             if (lca)
39             {
40                 f[i][0]=lca,dep[i]=dep[lca]+1;
41                 for (int j=1;j<=log(n)/log(2);j++) f[i][j]=f[f[i][j-1]][j-1];
42             }
43             else dep[i]=-1,o=0;
44         }
45         if (o) change(1,1,n,l,r,i);
46         printf("%d\n",dep[i]);
47     }
48 }

转载于:https://www.cnblogs.com/Comfortable/p/10336167.html

[支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行相关推荐

  1. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  3. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  4. 主席树——多棵线段树的集合

    主席树: (不要管名字) 我们有的时候,会遇到很多种情况,对于每一种情况,都需要通过线段树的操作实现. 碰巧的是,相邻两种情况下的线段树的差异不大.(总体的差异次数是O(N)级别的,均摊就是O(常数) ...

  5. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  6. 暑假集训8.10-网络流套树剖套线段树

    题目:dtoj2797旅行商 其实就是裸的网络流套树剖套线段树其实代码不难码 emmmmmm我决定草率的直接上代码,这可能是一条无营养的博客.... #include<bits/stdc++.h ...

  7. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  8. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  9. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

最新文章

  1. 大师Martin Fowler强烈推荐的一本书
  2. svn update 报错,必须先cleanup,然后cleanup失败解决方法
  3. 《数据结构与算法》课程设计报告——赫夫曼编码/译码器
  4. nodejs readfilesync 路径_Linux 磁盘多路径聚合multipath
  5. oracle inventory directory,oraInventory目录的作用
  6. 数据行业工作3年,我靠这7个能力,成为领导青睐的高级数据分析师
  7. memchache的数据类型_memcache详解
  8. iOS 12第二次大更新发布:曝光重磅硬件
  9. python去重排序_python文本去重并排序
  10. 江苏省普通话水平测试计算机评分细则,江苏省普通话水平测试评分细则(试行).doc...
  11. 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)
  12. 关于android的nfc问题 Ultralight c (通用卡)
  13. 计算器 android报告,bmi计算器android开放实验项目总结报告.pdf
  14. 箱线图(Boxplot)也称箱须图(Box-whisker Plot)
  15. matlab把图片制作成视频
  16. Cloud Foundry 峰会进入中国 全球专家与你面对面
  17. 二叉树的前序遍历-python
  18. 易模3D建模教程 |手机也能编辑3D模型,快速生成人头像!
  19. Rational Rose 画时序图 且保存为图片文件
  20. php 大数相加,吉首大学第九届"新星杯"大学生程序设计大赛(示例代码)

热门文章

  1. Python 开发者的 10 大编程开发环境(IDE),第一款是我的最爱
  2. 从放苹果问题到零钱兑换问题(动态规划)
  3. git的环境配置与从cmd下载文件
  4. 关于Android应用中的悬浮窗(一)——权限
  5. 2020年中国超声行业现状与竞争格局分析,目前小型化超声市场份额还较小「图」
  6. 使用ssd1306驱动,来驱动0.96寸中景园oled屏幕
  7. PHP判断用户浏览器是pc、Android、IOS、微信、QQ、安卓、苹果源码
  8. 搜索+图论 你我都能看懂
  9. [iOS]调用系统电话,邮件,手机QQ,微信
  10. 白领夫妇卖房回乡 卖掉深圳一套房回武汉换了4套学区房