【BZOJ4154】[Ipsc2015]Generating Synergy KDtree
【BZOJ4154】[Ipsc2015]Generating Synergy
Description
Input
Output
Sample Input
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
HINT
题解:想了半天奇怪的做法,正解居然是KDtree?
KDtree的第一维是DFS序,第二维是深度,区间修改用打标记实现,查询时下传标记,剩下的就不用说了吧?
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- const ll P=1000000007;
- const int maxn=100010;
- int n,m,D,rt,cnt;
- ll ans;
- int to[maxn],next[maxn],head[maxn],p[maxn],q[maxn],fa[maxn],L[2],R[2],dep[maxn],st[maxn],pos[maxn];
- struct kd
- {
- int ls,rs,fa,tag,col,org,v[2],sm[2],sn[2];
- kd(){}
- 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;}
- }t[maxn];
- bool cmp(const kd &a,const kd &b)
- {
- return (a.v[D]==b.v[D])?(a.v[D^1]<b.v[D^1]):(a.v[D]<b.v[D]);
- }
- inline int rd()
- {
- int ret=0,f=1; char gc=getchar();
- while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
- while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
- return ret*f;
- }
- inline void add(int a,int b)
- {
- to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
- }
- void dfs(int x)
- {
- p[x]=++p[0];
- for(int i=head[x];i!=-1;i=next[i]) dep[to[i]]=dep[x]+1,dfs(to[i]);
- q[x]=p[0];
- }
- inline void pushup(int x,int y)
- {
- t[x].sm[0]=max(t[x].sm[0],t[y].sm[0]);
- t[x].sn[0]=min(t[x].sn[0],t[y].sn[0]);
- t[x].sm[1]=max(t[x].sm[1],t[y].sm[1]);
- t[x].sn[1]=min(t[x].sn[1],t[y].sn[1]);
- }
- inline void pushdown(int x)
- {
- if(t[x].tag)
- {
- if(t[x].ls) t[t[x].ls].col=t[t[x].ls].tag=t[x].tag;
- if(t[x].rs) t[t[x].rs].col=t[t[x].rs].tag=t[x].tag;
- t[x].tag=0;
- }
- }
- int build(int l,int r,int d)
- {
- if(l>r) return 0;
- int mid=(l+r)>>1;
- D=d,nth_element(t+l,t+mid,t+r+1,cmp),pos[t[mid].org]=mid;
- t[mid].ls=build(l,mid-1,d^1),t[mid].rs=build(mid+1,r,d^1);
- if(t[mid].ls) t[t[mid].ls].fa=mid,pushup(mid,t[mid].ls);
- if(t[mid].rs) t[t[mid].rs].fa=mid,pushup(mid,t[mid].rs);
- return mid;
- }
- void updata(int x,int y)
- {
- 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 ;
- pushdown(x);
- 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])
- {
- t[x].tag=t[x].col=y;
- return ;
- }
- 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;
- updata(t[x].ls,y),updata(t[x].rs,y);
- }
- inline int query(int x)
- {
- st[st[0]=1]=x;
- while(t[st[st[0]]].fa) st[st[0]+1]=t[st[st[0]]].fa,st[0]++;
- while(st[0]) pushdown(st[st[0]]),st[0]--;
- return t[x].col;
- }
- void work()
- {
- n=rd(),rd(),m=rd();
- memset(head,-1,sizeof(head)),cnt=0,ans=0;
- int i,a,b,c;
- for(i=2;i<=n;i++) fa[i]=rd(),add(fa[i],i);
- dep[1]=1,dfs(1);
- for(i=1;i<=n;i++) t[i]=kd(p[i],dep[i],i);
- rt=build(1,n,0);
- for(i=1;i<=m;i++)
- {
- a=rd(),b=rd(),c=rd();
- if(!c) ans=(ans+(ll)i*query(pos[a]))%P;
- else L[0]=p[a],R[0]=q[a],L[1]=dep[a],R[1]=dep[a]+b,updata(rt,c);
- }
- printf("%lld\n",ans);
- }
- int main()
- {
- int T=rd();
- while(T--) work();
- return 0;
- }//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的更多相关文章
- 【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)\)中,深度自然 ...
- 【bzoj4154】(dfs序+kd-tree)
传送门 题意: 给出一颗以\(1\)为根的有根树,初始所有结点的颜色为\(1\). 之后有两个操作,一种是每次将距离\(a\)结点距离不超过\(l\)的所有儿子结点颜色染为\(c\):另一种是询问结点 ...
- BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序
多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...
- BZOJ4154:[IPSC2015]Generating Synergy
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- 【BZOJ4155】[Ipsc2015]Humble Captains 最小割+DP
[BZOJ4155][Ipsc2015]Humble Captains Description 每天下午放学时都有n个zky冲出教室去搞基.搞基的zky们分成两队,编号为1的zky是1号队的首领,编号 ...
- 【BZOJ4066】简单题(KD-Tree)
[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...
- 【BZOJ2648】SJY摆棋子 KDtree
[BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...
- 【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy
区间修改的kd-tree,打标记,下传. 每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问. #include<cstdio> #include<algorithm& ...
随机推荐
- ARCGIS FLEX API加载google地图、百度地图、天地图(转)
http://www.cnblogs.com/chenyuming507950417/ Flex加载google地图.百度地图以及天地图作底图 一 Flex加载Google地图作底图 (1)帮助类G ...
- ISP模块之色彩增强算法--HSV空间Saturation通道调整 .
色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度.而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和.丰富起来.对应于Photoshop里 ...
- jQuery中dom对象与jQuery对象之间互相转换
首先介绍一下什么是dom对象什么时候jQuery对象 1.dom对象就是使用原生js的api获取到的对象就是dom对象 eg: var box1 = document.getElementById(& ...
- 2017.3.31 spring mvc教程(三)拦截器
学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...
- RFS 理解
1.背景 网卡接收一个数据包的情况下,会经过三个阶段: - 网卡产生硬件中断通知CPU有包到达 - 通过软中断处理此数据包 - 在用户态程序处理此数据包 在SMP体系下,这三个阶段有可能在3个 ...
- react-native 扫一扫功能(二维码扫描)功能开发
1.安装插件 yarn add react-native-smart-barcode 2.关联 react-native link react-native-smart-barcode 3.修改 an ...
- react-native 极光推送(jpush-react-native)
极光推送官方支持的 React Native 插件 安装 npm install jpush-react-native --savenpm install jcore-react-native --s ...
- JavaScript创建块级作用域
1.JavaScript创建块级作用域 (1)方法一:ES6 (2)方法二:闭包 2.示例 <!DOCTYPE html> <html lang="zh"> ...
- magento安装wordpress
说起来事实上很easy,如今简诉一下安装过程 1.到magento connect界面安装magento扩展,地址:http://www.magentocommerce.com/magento-con ...
- BufferedReader 使用 readLine() 读取 UTF-8 格式的文本第一行第一个字符是空字符的解决办法
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(ksmgVo.getFiledata( ...