【BZOJ4154】[Ipsc2015]Generating Synergy

Description

给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色

Input

第一行一个数T,表示数据组数
接下来每组数据的第一行三个数n,c,q表示结点个数,颜色数和操作数
接下来一行n-1个数描述2..n的父节点
接下来q行每行三个数a,l,c
若c为0,表示询问a的颜色
否则将距离a不超过l的a的子节点染成c

Output

设当前是第i个操作,y_i为本次询问的答案(若本次操作是一个修改则y_i为0),令z_i=i*y_i,请输出z_1+z_2+...+z_q模10^9+7

Sample Input

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

Sample Output

32

HINT

第1,3,5,7的询问的答案分别为1,3,3,1,所以答案为 1*1+2*0+3*3+4*0+5*3+6*0+7*1=32.
数据范围:
对于100%的数据T<=6,n,m,c<=10^5,
1<=a<=n,0<=l<=n,0<=c<=c

题解:想了半天奇怪的做法,正解居然是KDtree?

KDtree的第一维是DFS序,第二维是深度,区间修改用打标记实现,查询时下传标记,剩下的就不用说了吧?

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const ll P=1000000007;
  8. const int maxn=100010;
  9. int n,m,D,rt,cnt;
  10. ll ans;
  11. int to[maxn],next[maxn],head[maxn],p[maxn],q[maxn],fa[maxn],L[2],R[2],dep[maxn],st[maxn],pos[maxn];
  12. struct kd
  13. {
  14. int ls,rs,fa,tag,col,org,v[2],sm[2],sn[2];
  15. kd(){}
  16. kd(int a,int b,int c){sm[0]=sn[0]=v[0]=a,sm[1]=sn[1]=v[1]=b,org=c,ls=rs=fa=0,tag=0,col=1;}
  17. }t[maxn];
  18. bool cmp(const kd &a,const kd &b)
  19. {
  20. return (a.v[D]==b.v[D])?(a.v[D^1]<b.v[D^1]):(a.v[D]<b.v[D]);
  21. }
  22. inline int rd()
  23. {
  24. int ret=0,f=1; char gc=getchar();
  25. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  26. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  27. return ret*f;
  28. }
  29. inline void add(int a,int b)
  30. {
  31. to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
  32. }
  33. void dfs(int x)
  34. {
  35. p[x]=++p[0];
  36. for(int i=head[x];i!=-1;i=next[i]) dep[to[i]]=dep[x]+1,dfs(to[i]);
  37. q[x]=p[0];
  38. }
  39. inline void pushup(int x,int y)
  40. {
  41. t[x].sm[0]=max(t[x].sm[0],t[y].sm[0]);
  42. t[x].sn[0]=min(t[x].sn[0],t[y].sn[0]);
  43. t[x].sm[1]=max(t[x].sm[1],t[y].sm[1]);
  44. t[x].sn[1]=min(t[x].sn[1],t[y].sn[1]);
  45. }
  46. inline void pushdown(int x)
  47. {
  48. if(t[x].tag)
  49. {
  50. if(t[x].ls) t[t[x].ls].col=t[t[x].ls].tag=t[x].tag;
  51. if(t[x].rs) t[t[x].rs].col=t[t[x].rs].tag=t[x].tag;
  52. t[x].tag=0;
  53. }
  54. }
  55. int build(int l,int r,int d)
  56. {
  57. if(l>r) return 0;
  58. int mid=(l+r)>>1;
  59. D=d,nth_element(t+l,t+mid,t+r+1,cmp),pos[t[mid].org]=mid;
  60. t[mid].ls=build(l,mid-1,d^1),t[mid].rs=build(mid+1,r,d^1);
  61. if(t[mid].ls) t[t[mid].ls].fa=mid,pushup(mid,t[mid].ls);
  62. if(t[mid].rs) t[t[mid].rs].fa=mid,pushup(mid,t[mid].rs);
  63. return mid;
  64. }
  65. void updata(int x,int y)
  66. {
  67. if(!x||t[x].sn[0]>R[0]||t[x].sm[0]<L[0]||t[x].sn[1]>R[1]||t[x].sm[1]<L[1]) return ;
  68. pushdown(x);
  69. if(t[x].sm[0]<=R[0]&&t[x].sn[0]>=L[0]&&t[x].sm[1]<=R[1]&&t[x].sn[1]>=L[1])
  70. {
  71. t[x].tag=t[x].col=y;
  72. return ;
  73. }
  74. if(t[x].v[0]<=R[0]&&t[x].v[0]>=L[0]&&t[x].v[1]<=R[1]&&t[x].v[1]>=L[1]) t[x].col=y;
  75. updata(t[x].ls,y),updata(t[x].rs,y);
  76. }
  77. inline int query(int x)
  78. {
  79. st[st[0]=1]=x;
  80. while(t[st[st[0]]].fa) st[st[0]+1]=t[st[st[0]]].fa,st[0]++;
  81. while(st[0]) pushdown(st[st[0]]),st[0]--;
  82. return t[x].col;
  83. }
  84. void work()
  85. {
  86. n=rd(),rd(),m=rd();
  87. memset(head,-1,sizeof(head)),cnt=0,ans=0;
  88. int i,a,b,c;
  89. for(i=2;i<=n;i++) fa[i]=rd(),add(fa[i],i);
  90. dep[1]=1,dfs(1);
  91. for(i=1;i<=n;i++) t[i]=kd(p[i],dep[i],i);
  92. rt=build(1,n,0);
  93. for(i=1;i<=m;i++)
  94. {
  95. a=rd(),b=rd(),c=rd();
  96. if(!c) ans=(ans+(ll)i*query(pos[a]))%P;
  97. else L[0]=p[a],R[0]=q[a],L[1]=dep[a],R[1]=dep[a]+b,updata(rt,c);
  98. }
  99. printf("%lld\n",ans);
  100. }
  101. int main()
  102. {
  103. int T=rd();
  104. while(T--) work();
  105. return 0;
  106. }//1 4 3 7 1 2 2 3 0 0 2 1 3 3 0 0 1 0 2 2 0 0 4 1 1 4 0 0

【BZOJ4154】[Ipsc2015]Generating Synergy KDtree的更多相关文章

  1. 【bzoj4154】[Ipsc2015]Generating Synergy KD-tree

    题目描述 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 输入 第一行一个数T,表示数据组数 接下来每组数据的第一行三个数n,c,q表示结 ...

  2. 【bzoj 4154】[Ipsc2015]Generating Synergy

    题目 大概已经掌握熟练码出\(kdt\)的技能了 发现距离子树根节点\(x\)不超过\(l\)的点可以用两种方式来限制,首先\(dfs\)序在\([dfn_x,dfn_x+sum_x)\)中,深度自然 ...

  3. 【bzoj4154】(dfs序+kd-tree)

    传送门 题意: 给出一颗以\(1\)为根的有根树,初始所有结点的颜色为\(1\). 之后有两个操作,一种是每次将距离\(a\)结点距离不超过\(l\)的所有儿子结点颜色染为\(c\):另一种是询问结点 ...

  4. BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序

    多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...

  5. BZOJ4154:[IPSC2015]Generating Synergy

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  6. 【BZOJ4155】[Ipsc2015]Humble Captains 最小割+DP

    [BZOJ4155][Ipsc2015]Humble Captains Description 每天下午放学时都有n个zky冲出教室去搞基.搞基的zky们分成两队,编号为1的zky是1号队的首领,编号 ...

  7. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  8. 【BZOJ2648】SJY摆棋子 KDtree

    [BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...

  9. 【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy

    区间修改的kd-tree,打标记,下传. 每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问. #include<cstdio> #include<algorithm& ...

随机推荐

  1. ARCGIS FLEX API加载google地图、百度地图、天地图(转)

    http://www.cnblogs.com/chenyuming507950417/ Flex加载google地图.百度地图以及天地图作底图 一  Flex加载Google地图作底图 (1)帮助类G ...

  2. ISP模块之色彩增强算法--HSV空间Saturation通道调整 .

    色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度.而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和.丰富起来.对应于Photoshop里 ...

  3. jQuery中dom对象与jQuery对象之间互相转换

    首先介绍一下什么是dom对象什么时候jQuery对象 1.dom对象就是使用原生js的api获取到的对象就是dom对象 eg: var box1 = document.getElementById(& ...

  4. 2017.3.31 spring mvc教程(三)拦截器

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  5. RFS 理解

    1.背景 网卡接收一个数据包的情况下,会经过三个阶段:   - 网卡产生硬件中断通知CPU有包到达 - 通过软中断处理此数据包 - 在用户态程序处理此数据包   在SMP体系下,这三个阶段有可能在3个 ...

  6. react-native 扫一扫功能(二维码扫描)功能开发

    1.安装插件 yarn add react-native-smart-barcode 2.关联 react-native link react-native-smart-barcode 3.修改 an ...

  7. react-native 极光推送(jpush-react-native)

    极光推送官方支持的 React Native 插件 安装 npm install jpush-react-native --savenpm install jcore-react-native --s ...

  8. JavaScript创建块级作用域

    1.JavaScript创建块级作用域 (1)方法一:ES6 (2)方法二:闭包 2.示例 <!DOCTYPE html> <html lang="zh"> ...

  9. magento安装wordpress

    说起来事实上很easy,如今简诉一下安装过程 1.到magento connect界面安装magento扩展,地址:http://www.magentocommerce.com/magento-con ...

  10. BufferedReader 使用 readLine() 读取 UTF-8 格式的文本第一行第一个字符是空字符的解决办法

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(ksmgVo.getFiledata( ...