BZOJ_4448_[Scoi2015]情报传递_主席树

Description

奈特公司是一个巨大的情报公司,它有着庞大的情报网络。情报网络中共有n名情报员。每名情报员口J-能有
若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线。奈特公司纪律森严,每
名情报员只能与自己的上、下线联系,同时,情报网络中仟意两名情报员一定能够通过情报网络传递情报。
奈特公司每天会派发以下两种任务中的一个任务:
1.搜集情报:指派T号情报员搜集情报
2.传递情报:将一条情报从X号情报员传递给Y号情报员
情报员最初处于潜伏阶段,他们是相对安全的,我们认为此时所有情报员的危险值为0;-旦某个情报员开
始搜集情报,他的危险值就会持续增加,每天增加1点危险值(开始搜集情报的当天危险值仍为0,第2天
危险值为1,第3天危险值为2,以此类推)。传递情报并不会使情报员的危险值增加。
为了保证传递情报的过程相对安全,每条情报都有一个风险控制值C。余特公司认为,参与传递这条情
报的所有情报员中,危险值大于C的情报员将对该条情报构成威胁。现在,奈特公司希望知道,对于每
个传递情报任务,参与传递的情报员有多少个,其中对该条情报构成威胁的情报员有多少个。

Input

第1行包含1个正整数n,表示情报员个数。
笫2行包含n个非负整数,其中第i个整数Pi表示i号情报员上线的编号。特别地,若Pi=0,表示i号
情报员是大头目。
第3行包含1个正整数q,表示奈特公司将派发q个任务(每天一个)。
随后q行,依次描述q个任务。
每行首先有1个正整数k。若k=1,表示任务是传递情报,随后有3个正整数Xi、Yi、Ci,依次表示传递
情报的起点、终点和风险控制值;若k=2,表示任务是搜集情报,随后有1个正整数Ti,表示搜集情报的
情报员编号。

Output

对于每个传递情报任务输出一行,应包含两个整数,分别是参与传递情报的情报员个数和对该条情报构成威胁的情报员个数。
输出的行数应等于传递情报任务的个数,每行仅包含两个整数,用一个空格隔开。输出不应包含多余的空行和空格。

Sample Input

7
0 1 1 2 2 3 3
6
1 4 7 0
2 1
2 4
2 7
1 4 7 1
1 4 7 3

Sample Output

5 0
5 2
5 1

离线,求出每个点开始搜集情报的最早的时间。

然后询问相当于查询有多少个点,满足位置和时间两个条件。

于是用主席树数一下点即可。

主席树维护根到路径的信息。

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 200050
  6. int head[N],to[N<<1],nxt[N<<1],cnt,dfn[N],dep[N],fa[N],root[N],ls[N*30],rs[N*30],t[N*30],tot;
  7. int f[N][20],rt,n,m;
  8. struct A {
  9. int opt,x,y,z;
  10. }a[N];
  11. inline void add(int u,int v) {
  12. to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
  13. }
  14. void insert(int &y,int x,int l,int r,int v) {
  15. y=++tot; t[y]=t[x]+1;
  16. if(l==r) return ;
  17. int mid=(l+r)>>1;
  18. if(v<=mid) rs[y]=rs[x],insert(ls[y],ls[x],l,mid,v);
  19. else ls[y]=ls[x],insert(rs[y],rs[x],mid+1,r,v);
  20. }
  21. void dfs(int x,int y) {
  22. int i;
  23. f[x][0]=y;
  24. if(dfn[x]) insert(root[x],root[y],1,m,dfn[x]);
  25. else root[x]=root[y];
  26. dep[x]=dep[y]+1;
  27. for(i=head[x];i;i=nxt[i]) {
  28. if(to[i]!=y) {
  29. dfs(to[i],x);
  30. }
  31. }
  32. }
  33. int lca(int x,int y) {
  34. int i;
  35. if(dep[x]<dep[y]) swap(x,y);
  36. for(i=18;i>=0;i--) {
  37. if(f[x][i]&&dep[f[x][i]]>=dep[y]) x=f[x][i];
  38. }
  39. if(x==y) return x;
  40. for(i=18;i>=0;i--) {
  41. if(f[x][i]!=f[y][i]) {
  42. x=f[x][i]; y=f[y][i];
  43. }
  44. }
  45. return f[x][0];
  46. }
  47. int query(int x,int y,int z,int w,int l,int r,int v) {
  48. if(l==r) return t[x]+t[y]-t[z]-t[w];
  49. int sizls=t[ls[x]]+t[ls[y]]-t[ls[z]]-t[ls[w]],mid=(l+r)>>1;
  50. if(v<=mid) return query(ls[x],ls[y],ls[z],ls[w],l,mid,v);
  51. else return query(rs[x],rs[y],rs[z],rs[w],mid+1,r,v)+sizls;
  52. }
  53. int main() {
  54. scanf("%d",&n);
  55. int i,x,j;
  56. for(i=1;i<=n;i++) {
  57. scanf("%d",&x);
  58. if(x) {
  59. add(x,i); add(i,x);
  60. }
  61. }
  62. scanf("%d",&m);
  63. for(i=1;i<=m;i++) {
  64. scanf("%d",&a[i].opt);
  65. if(a[i].opt==1) {
  66. scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
  67. }else {
  68. scanf("%d",&x); if(!dfn[x]) dfn[x]=i;
  69. }
  70. }
  71. dfs(1,0);
  72. for(j=1;(1<<j)<=n;j++) {
  73. for(i=1;i<=n;i++) {
  74. f[i][j]=f[f[i][j-1]][j-1];
  75. }
  76. }
  77. for(i=1;i<=m;i++) {
  78. if(a[i].opt==1) {
  79. int l=lca(a[i].x,a[i].y);
  80. int p=f[l][0];
  81. printf("%d ",dep[a[i].x]+dep[a[i].y]-2*dep[l]+1);
  82. if(i-a[i].z<=0) {
  83. printf("0\n");continue;
  84. }
  85. printf("%d\n",query(root[a[i].x],root[a[i].y],root[l],root[p],1,m,i-a[i].z-1));
  86. }
  87. }
  88. }

BZOJ_4448_[Scoi2015]情报传递_主席树的更多相关文章

  1. bzoj 4448 [Scoi2015]情报传递(主席树,LCA)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...

  2. BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT

    BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. I ...

  3. BZOJ_3772_精神污染_主席树

    BZOJ_3772_精神污染_主席树 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大 ...

  4. BZOJ_3932_[CQOI2015]任务查询系统_主席树

    BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...

  5. BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并

    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20 ...

  6. BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数

    BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...

  7. BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)

    即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...

  8. [bzoj4826][Hnoi2017]影魔_单调栈_主席树

    影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...

  9. [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树

    混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...

随机推荐

  1. 简单了解JS中的几种遍历

    忙了好一段时间,项目上线后终于有那么一点点空档期静下来整理一些问题了.当我们在开发项目的时候,用到遍历的地方肯定少不了,那么我们有那么多的遍历方法,在不同情况下用那种方法会更优雅而且还没bug呢? 首 ...

  2. permutations II(全排列 2)

    题目要求 Given a collection of numbers that might contain duplicates, return all possible unique permuta ...

  3. java 远程调试方法

    http://wenku.baidu.com/link?url=5p3GZhPcfvM-VOzAFeCjbLeVv0OQrAGJh4HxirqImuK9VxPfmW243T_l5Plj6KdDZB1I ...

  4. Swift内部类调用外部类方法、属性的变通

    Swift的内部类比较鸡肋,在内部类里面不能调用外部类的属性或方法,那么如何解决这个问题,把内部类里面调用外部类的那部分代码方法移动到外部类里面,成为外部类的方法,是一种变通解决方式.

  5. jsoup 使用总结1--添加header

    jsoup 使用总结1--添加header 大部分时候,我们使用jsoup解析网页的是否都是直接Jsoup.connect(url); 孰不知,我们可以添加header,例如 Host, Refere ...

  6. myeclipse 的Customize Perspective 没有反应

    MyEclipse 2014 工具栏里的Quick Access老是跳上跳下的,弄得我很烦,所以就想自定义一下工具栏,结果 window--> customize perspective 没用 ...

  7. 用post请求方式实现对地图服务的基本操作

    ArcGIS Server REST API 中的很多操作都可以用以下方式实现,具体参数的设置请查看其中的详细说明 public List<string> getGeometry(stri ...

  8. Pygame常用方法

    '''import pygame# 初始化pygame库,让计算机硬件准备pygame.init()# ----------窗口相关操作-----------# 创建窗口window = pygame ...

  9. Global一点小经验

    Global: Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法,他位于应用程序根目录下. 这个 Global.asax ...

  10. Linux集群服务 LVS

    linux虚拟服务器(LVS)项目在linux操作系统上提供了最常见的负载均衡软件. 集群定义: 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性 ...