【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy
区间修改的kd-tree,打标记,下传。
每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问。
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- #define N 100001
- #define KD 2
- int n,root,m,q,qp[2][KD],fa[N],val,delta[N];
- bool dn;
- struct Node
- {
- int ch[2],w,minn[KD],maxx[KD],p[KD],id;
- void Init()
- {
- for(int i=0;i<KD;++i)
- minn[i]=maxx[i]=p[i];
- }
- }T[N];
- bool operator < (const Node &a,const Node &b){return a.p[dn] < b.p[dn];}
- inline void pushup(const int &rt)
- {
- for(int i=0;i<2;++i)
- if(T[rt].ch[i])
- for(int j=0;j<KD;++j)
- {
- T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
- T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
- }
- }
- inline void pushdown(const int &rt)
- {
- if(delta[rt])
- {
- T[rt].w=delta[rt];
- for(int i=0;i<2;++i)
- delta[T[rt].ch[i]]=delta[rt];
- delta[rt]=0;
- }
- }
- int buildtree(int l=1,int r=n,bool d=0)
- {
- dn=d;
- int m=(l+r>>1);
- nth_element(T+l,T+m,T+r+1);
- T[m].Init();
- if(l!=m) T[m].ch[0]=buildtree(l,m-1,d^1);
- if(m!=r) T[m].ch[1]=buildtree(m+1,r,d^1);
- pushup(m);
- return m;
- }
- void Update(int rt=root)
- {
- if(qp[0][0] <= T[rt].minn[0] && T[rt].maxx[0] <= qp[0][1]
- && qp[1][0] <= T[rt].minn[1] && T[rt].maxx[1] <= qp[1][1])
- {
- delta[rt]=val;
- return;
- }
- pushdown(rt);
- if(qp[0][0] <= T[rt].p[0] && T[rt].p[0] <= qp[0][1]
- && qp[1][0] <= T[rt].p[1] && T[rt].p[1] <= qp[1][1])
- T[rt].w=val;
- for(int i=0;i<2;++i)
- if(T[rt].ch[i]
- && qp[0][0] <= T[T[rt].ch[i]].maxx[0] && T[T[rt].ch[i]].minn[0] <= qp[0][1]
- && qp[1][0] <= T[T[rt].ch[i]].maxx[1] && T[T[rt].ch[i]].minn[1] <= qp[1][1])
- Update(T[rt].ch[i]);
- }
- void Query(int U)
- {
- if(fa[U])
- Query(fa[U]);
- pushdown(U);
- }
- int zu;
- int v[N],next[N],first[N],e;
- void AddEdge(const int &U,const int &V)
- {
- v[++e]=V;
- next[e]=first[U];
- first[U]=e;
- }
- int dep[N],dfn[N],dfr[N];
- void dfs(int U)
- {
- dfn[U]=++e;
- T[U].w=1;
- T[U].p[0]=e;
- T[U].p[1]=dep[U];
- T[U].id=U;
- for(int i=first[U];i;i=next[i])
- {
- dep[v[i]]=dep[U]+1;
- dfs(v[i]);
- }
- dfr[U]=e;
- }
- typedef long long ll;
- #define MOD 1000000007ll
- ll ans;
- int ma[N];
- int main()
- {
- // freopen("bzoj4154.in","r",stdin);
- scanf("%d",&zu);
- for(;zu;--zu)
- {
- int x,dis;
- scanf("%d%d%d",&n,&m,&q);
- for(int i=2;i<=n;++i)
- {
- scanf("%d",&x);
- AddEdge(x,i);
- }
- e=0; dep[1]=1;
- dfs(1);
- buildtree();
- root=(1+n>>1);
- for(int i=1;i<=n;++i)
- {
- ma[T[i].id]=i;
- for(int j=0;j<2;++j)
- if(T[i].ch[j])
- fa[T[i].ch[j]]=i;
- }
- for(int i=1;i<=q;++i)
- {
- scanf("%d%d%d",&x,&dis,&val);
- if(!val)
- {
- Query(ma[x]);
- ans=(ans+(ll)i*(ll)T[ma[x]].w%MOD)%MOD;
- }
- else
- {
- qp[0][0]=dfn[x];
- qp[0][1]=dfr[x];
- qp[1][0]=dep[x];
- qp[1][1]=dep[x]+dis;
- Update();
- }
- }
- printf("%lld\n",ans);
- for(int i=1;i<=n;++i)
- T[i].ch[0]=T[i].ch[1]=0;
- memset(delta+1,0,sizeof(int)*n);
- memset(fa+1,0,sizeof(int)*n);
- ans=e=0;
- memset(first+1,0,sizeof(int)*n);
- }
- return 0;
- }
【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy的更多相关文章
- BZOJ4154:[Ipsc2015]Generating Synergy(K-D Tree)
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一行三 ...
- BZOJ4154: [Ipsc2015]Generating Synergy
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一 ...
- 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree
[BZOJ4154][Ipsc2015]Generating Synergy Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问 ...
- BZOJ4154:[IPSC2015]Generating Synergy
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- [bzoj4154][Ipsc2015]Generating Synergy_KD-Tree_dfs序
Generating Synergy bzoj-4154 Ipsc-2015 题目大意:给定一棵n个节点树,m个操作,支持:将一个点周围所有距该点距离不超过l的子结点的颜色改成另一种颜色:查询单点颜色 ...
- 【BZOJ4154】Generating Synergy【kd树】
题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...
- 【bzoj4154】[Ipsc2015]Generating Synergy KD-tree
题目描述 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 输入 第一行一个数T,表示数据组数 接下来每组数据的第一行三个数n,c,q表示结 ...
- 【bzoj 4154】[Ipsc2015]Generating Synergy
题目 大概已经掌握熟练码出\(kdt\)的技能了 发现距离子树根节点\(x\)不超过\(l\)的点可以用两种方式来限制,首先\(dfs\)序在\([dfn_x,dfn_x+sum_x)\)中,深度自然 ...
- 【Symmetric Tree】cpp
题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...
随机推荐
- OFBIZ:启动之StartupLoader
任意一个JAVA程序都是从main()开始启动的,OFBIZ也不例外.OFBIZ的main()位于framework/start/src/org/ofbiz/base/start/Start.java ...
- SSH框架流程
流程图 具体步骤 一.实体类 //Serializable在网络的环境下做类传输public class Category implements Serializable { private Inte ...
- UBUNTU 13.04 install Grive
sudo apt-get install software-properties-common sudo apt-get install python-software-properties sudo ...
- Windows:文件服务器,访问进去不能查看到完整的文件
文件服务器,访问进去不能查看到完整的文件:别人访问却可以查看到完整的所有文件 可能是登录的帐号串掉导致,删除文件服务器帐号,重新访问: cmd: net use /delete *
- Reprot中的五个Trigger说明
Report Trigger 1.1 Which report trigger to use As a general rule, any processing that will affect th ...
- VerbalExpressions ——另类正则表达式
对于文本处理来说,正则表达式无疑是一个非常强大的工具.但是编写和阅读正则表达式往往就不是那么一件非常愉快的事情了.本文在这里介绍另一种另类的正则表达式——VerbalExpressions,它采用函数 ...
- Python学习笔记(四)字符串型
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言 ...
- window删除文件时提示: 源文件名长度大于系统支持的长度
有时候删除windows中的目录的时候,会出现"源文件名长度大于系统支持的长度", 而导致不能删除, 作为一个程序猿, 怎么可以被这个折服呢, 原理: 利用 Java 递归删除文 ...
- 双机相关知识(原理、LVM、Raid技术)
1 双机知识 1.1 预备知识 1.1.1 基本概念 双机热备:双机热备双机管理软件可以根据心跳自动检测环境运行情况,如果发现一个节点挂掉了,会自动切换到另外一个 ...
- python之urllib
简单的web应用包括使用被称为url(统一资源定位器,uniform resource locator)的web地址 这个地址用来在web上定位一个文档,或调用一个CGI程序来为你的客户端产生一个文档 ...