区间修改的kd-tree,打标记,下传。

每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. #define N 100001
  6. #define KD 2
  7. int n,root,m,q,qp[2][KD],fa[N],val,delta[N];
  8. bool dn;
  9. struct Node
  10. {
  11. int ch[2],w,minn[KD],maxx[KD],p[KD],id;
  12. void Init()
  13. {
  14. for(int i=0;i<KD;++i)
  15. minn[i]=maxx[i]=p[i];
  16. }
  17. }T[N];
  18. bool operator < (const Node &a,const Node &b){return a.p[dn] < b.p[dn];}
  19. inline void pushup(const int &rt)
  20. {
  21. for(int i=0;i<2;++i)
  22. if(T[rt].ch[i])
  23. for(int j=0;j<KD;++j)
  24. {
  25. T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
  26. T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
  27. }
  28. }
  29. inline void pushdown(const int &rt)
  30. {
  31. if(delta[rt])
  32. {
  33. T[rt].w=delta[rt];
  34. for(int i=0;i<2;++i)
  35. delta[T[rt].ch[i]]=delta[rt];
  36. delta[rt]=0;
  37. }
  38. }
  39. int buildtree(int l=1,int r=n,bool d=0)
  40. {
  41. dn=d;
  42. int m=(l+r>>1);
  43. nth_element(T+l,T+m,T+r+1);
  44. T[m].Init();
  45. if(l!=m) T[m].ch[0]=buildtree(l,m-1,d^1);
  46. if(m!=r) T[m].ch[1]=buildtree(m+1,r,d^1);
  47. pushup(m);
  48. return m;
  49. }
  50. void Update(int rt=root)
  51. {
  52. if(qp[0][0] <= T[rt].minn[0] && T[rt].maxx[0] <= qp[0][1]
  53. && qp[1][0] <= T[rt].minn[1] && T[rt].maxx[1] <= qp[1][1])
  54. {
  55. delta[rt]=val;
  56. return;
  57. }
  58. pushdown(rt);
  59. if(qp[0][0] <= T[rt].p[0] && T[rt].p[0] <= qp[0][1]
  60. && qp[1][0] <= T[rt].p[1] && T[rt].p[1] <= qp[1][1])
  61. T[rt].w=val;
  62. for(int i=0;i<2;++i)
  63. if(T[rt].ch[i]
  64. && qp[0][0] <= T[T[rt].ch[i]].maxx[0] && T[T[rt].ch[i]].minn[0] <= qp[0][1]
  65. && qp[1][0] <= T[T[rt].ch[i]].maxx[1] && T[T[rt].ch[i]].minn[1] <= qp[1][1])
  66. Update(T[rt].ch[i]);
  67. }
  68. void Query(int U)
  69. {
  70. if(fa[U])
  71. Query(fa[U]);
  72. pushdown(U);
  73. }
  74. int zu;
  75. int v[N],next[N],first[N],e;
  76. void AddEdge(const int &U,const int &V)
  77. {
  78. v[++e]=V;
  79. next[e]=first[U];
  80. first[U]=e;
  81. }
  82. int dep[N],dfn[N],dfr[N];
  83. void dfs(int U)
  84. {
  85. dfn[U]=++e;
  86. T[U].w=1;
  87. T[U].p[0]=e;
  88. T[U].p[1]=dep[U];
  89. T[U].id=U;
  90. for(int i=first[U];i;i=next[i])
  91. {
  92. dep[v[i]]=dep[U]+1;
  93. dfs(v[i]);
  94. }
  95. dfr[U]=e;
  96. }
  97. typedef long long ll;
  98. #define MOD 1000000007ll
  99. ll ans;
  100. int ma[N];
  101. int main()
  102. {
  103. // freopen("bzoj4154.in","r",stdin);
  104. scanf("%d",&zu);
  105. for(;zu;--zu)
  106. {
  107. int x,dis;
  108. scanf("%d%d%d",&n,&m,&q);
  109. for(int i=2;i<=n;++i)
  110. {
  111. scanf("%d",&x);
  112. AddEdge(x,i);
  113. }
  114. e=0; dep[1]=1;
  115. dfs(1);
  116. buildtree();
  117. root=(1+n>>1);
  118. for(int i=1;i<=n;++i)
  119. {
  120. ma[T[i].id]=i;
  121. for(int j=0;j<2;++j)
  122. if(T[i].ch[j])
  123. fa[T[i].ch[j]]=i;
  124. }
  125. for(int i=1;i<=q;++i)
  126. {
  127. scanf("%d%d%d",&x,&dis,&val);
  128. if(!val)
  129. {
  130. Query(ma[x]);
  131. ans=(ans+(ll)i*(ll)T[ma[x]].w%MOD)%MOD;
  132. }
  133. else
  134. {
  135. qp[0][0]=dfn[x];
  136. qp[0][1]=dfr[x];
  137. qp[1][0]=dep[x];
  138. qp[1][1]=dep[x]+dis;
  139. Update();
  140. }
  141. }
  142. printf("%lld\n",ans);
  143. for(int i=1;i<=n;++i)
  144. T[i].ch[0]=T[i].ch[1]=0;
  145. memset(delta+1,0,sizeof(int)*n);
  146. memset(fa+1,0,sizeof(int)*n);
  147. ans=e=0;
  148. memset(first+1,0,sizeof(int)*n);
  149. }
  150. return 0;
  151. }

【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy的更多相关文章

  1. BZOJ4154:[Ipsc2015]Generating Synergy(K-D Tree)

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

  2. BZOJ4154: [Ipsc2015]Generating Synergy

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

  3. 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree

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

  4. BZOJ4154:[IPSC2015]Generating Synergy

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

  5. [bzoj4154][Ipsc2015]Generating Synergy_KD-Tree_dfs序

    Generating Synergy bzoj-4154 Ipsc-2015 题目大意:给定一棵n个节点树,m个操作,支持:将一个点周围所有距该点距离不超过l的子结点的颜色改成另一种颜色:查询单点颜色 ...

  6. 【BZOJ4154】Generating Synergy【kd树】

    题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...

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

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

  8. 【bzoj 4154】[Ipsc2015]Generating Synergy

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

  9. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

随机推荐

  1. OFBIZ:启动之StartupLoader

    任意一个JAVA程序都是从main()开始启动的,OFBIZ也不例外.OFBIZ的main()位于framework/start/src/org/ofbiz/base/start/Start.java ...

  2. SSH框架流程

    流程图 具体步骤 一.实体类 //Serializable在网络的环境下做类传输public class Category implements Serializable { private Inte ...

  3. UBUNTU 13.04 install Grive

    sudo apt-get install software-properties-common sudo apt-get install python-software-properties sudo ...

  4. Windows:文件服务器,访问进去不能查看到完整的文件

    文件服务器,访问进去不能查看到完整的文件:别人访问却可以查看到完整的所有文件 可能是登录的帐号串掉导致,删除文件服务器帐号,重新访问: cmd: net use /delete *

  5. Reprot中的五个Trigger说明

    Report Trigger 1.1 Which report trigger to use As a general rule, any processing that will affect th ...

  6. VerbalExpressions ——另类正则表达式

    对于文本处理来说,正则表达式无疑是一个非常强大的工具.但是编写和阅读正则表达式往往就不是那么一件非常愉快的事情了.本文在这里介绍另一种另类的正则表达式——VerbalExpressions,它采用函数 ...

  7. Python学习笔记(四)字符串型

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言 ...

  8. window删除文件时提示: 源文件名长度大于系统支持的长度

    有时候删除windows中的目录的时候,会出现"源文件名长度大于系统支持的长度", 而导致不能删除, 作为一个程序猿, 怎么可以被这个折服呢, 原理: 利用 Java  递归删除文 ...

  9. 双机相关知识(原理、LVM、Raid技术)

    1        双机知识 1.1         预备知识 1.1.1     基本概念 双机热备:双机热备双机管理软件可以根据心跳自动检测环境运行情况,如果发现一个节点挂掉了,会自动切换到另外一个 ...

  10. python之urllib

    简单的web应用包括使用被称为url(统一资源定位器,uniform resource locator)的web地址 这个地址用来在web上定位一个文档,或调用一个CGI程序来为你的客户端产生一个文档 ...