BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
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
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
#define ls ch[p][0]
#define rs ch[p][1]
typedef long long ll;
const int mod=1000000007;
int head[N],to[N<<1],nxt[N<<1],C[N],n,T;
int dfn[N],dep[N],mx[N][2],ch[N][2],mn[N][2],root,now,cov[N],son[N],cnt;
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
struct Point {
int p[2];
bool operator < (const Point &x) const {
return p[now]==x.p[now]?p[!now]<x.p[!now]:p[now]<x.p[now];
}
}a[N],b[N];
void pushup(int p,int x) {
int i;
for(i=0;i<2;i++) mx[p][i]=max(mx[p][i],mx[x][i]),mn[p][i]=min(mn[p][i],mn[x][i]);
}
void pushdown(int p) {
if(cov[p]!=-1) {
cov[ls]=cov[rs]=C[ls]=C[rs]=cov[p];
cov[p]=-1;
}
}
int build(int l,int r,int type) {
int mid=(l+r)>>1; now=type;
nth_element(a+l,a+mid,a+r+1);
int i;
for(i=0;i<2;i++) mx[mid][i]=mn[mid][i]=a[mid].p[i];
if(l<mid) ch[mid][0]=build(l,mid-1,!type),pushup(mid,ch[mid][0]);
if(r>mid) ch[mid][1]=build(mid+1,r,!type),pushup(mid,ch[mid][1]);
return mid;
}
bool judge(int t1,int t2,int t3,int t4) {
return (t1<t3||t1>t4)&&(t2<t3||t2>t4);
}
void update(int x,int y,int z,int w,int p,int c) {
// printf("%d\n",p);
// printf("%d %d %d %d\n",x,y,z,w);
// a[x].mx[0] < bx || a[x].mn[0] > ex || a[x].mx[1] < by || a[x].mn[1] > ey
if(mn[p][0]>=x&&mx[p][0]<=z&&mn[p][1]>=y&&mx[p][1]<=w) {cov[p]=C[p]=c; return ;}
if(mx[p][0]<x||mn[p][0]>z||mx[p][1]<y||mn[p][1]>w) return ;
pushdown(p);
if(a[p].p[0]>=x&&a[p].p[0]<=z&&a[p].p[1]>=y&&a[p].p[1]<=w) C[p]=c;
if(ls) update(x,y,z,w,ls,c);
if(rs) update(x,y,z,w,rs,c);
}
int query(int x) {
int p=root;
now=0;
while(1) {
pushdown(p);
if(b[x]<a[p]) p=ls;
else if(a[p]<b[x]) p=rs;
else return C[p];
now=!now;
}
}
void dfs(int x,int y) {
int i;
dfn[x]=++dfn[0];
dep[x]=dep[y]+1;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y) dfs(to[i],x);
}
son[x]=dfn[0];
}
void solve() {
int Q;
memset(head,0,sizeof(head)); cnt=0;
memset(ch,0,sizeof(ch));
dfn[0]=0;
scanf("%d%*d%d",&n,&Q);
int i,x,y;
for(i=2;i<=n;i++) {
scanf("%d",&x); add(x,i); add(i,x);
}
dfs(1,0);
for(i=1;i<=n;i++) a[i].p[0]=dfn[i],a[i].p[1]=dep[i],cov[i]=-1,C[i]=1,b[i]=a[i];
root=build(1,n,0);
int ans=0,z;
// printf("%d %d %d\n",dfn[4],son[4],dep[4]);
for(i=1;i<=Q;i++) {
scanf("%d%d%d",&x,&y,&z);
if(z) {
update(dfn[x],dep[x],son[x],dep[x]+y,root,z);
}else {
ans=(ans+ll(i)*query(x)%mod)%mod;
// printf("%d\n",query(x));
}
}
printf("%d\n",ans);
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
solve();
}
}
BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree的更多相关文章
- 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree
[BZOJ4154][Ipsc2015]Generating Synergy Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问 ...
- [bzoj4154][Ipsc2015]Generating Synergy_KD-Tree_dfs序
Generating Synergy bzoj-4154 Ipsc-2015 题目大意:给定一棵n个节点树,m个操作,支持:将一个点周围所有距该点距离不超过l的子结点的颜色改成另一种颜色:查询单点颜色 ...
- BZOJ4154: [Ipsc2015]Generating Synergy
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一 ...
- 【kd-tree】bzoj4154 [Ipsc2015]Generating Synergy
区间修改的kd-tree,打标记,下传. 每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问. #include<cstdio> #include<algorithm& ...
- BZOJ4154:[Ipsc2015]Generating Synergy(K-D Tree)
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一行三 ...
- 【bzoj 4154】[Ipsc2015]Generating Synergy
题目 大概已经掌握熟练码出\(kdt\)的技能了 发现距离子树根节点\(x\)不超过\(l\)的点可以用两种方式来限制,首先\(dfs\)序在\([dfn_x,dfn_x+sum_x)\)中,深度自然 ...
- 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
题目描述 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 输入 第一行一个数T,表示数据组数 接下来每组数据的第一行三个数n,c,q表示结 ...
- BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序
多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...
随机推荐
- Shadow Map阴影贴图技术之探 【转】
这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...
- PriorityQueue ,ArrayList , 数组排序
static class E implements Comparable<E>{ int x ; int y ; int state ; int money ; public E(int ...
- [Guava源代码阅读笔记]-Basic Utilities篇-1
欢迎訪问:个人博客 写该系列文章的目的是记录Guava源代码中个人感觉不错且值得借鉴的内容. 一.MoreObjects类 //MoreObjects.ToStringHelper类的toString ...
- nginx list directory
使用 http autoindex 模块列出 目录, 例如 需要将 /var/www 下的 resourcepacks 目录以 http 的方式 暴露 这样设置 nginx ...
- python正则方法
通过正则替换字符串 res=re.sub(正则,newString,srcString)//返回替换后的字符串 res,m=res.subn(正则,newString,srcString)//返回替换 ...
- c和c++的输入输出
格式输出: printf(格式控制, 输出表列); %d 十进制数 %md m为指定的宽度 若数据位数小于m,则左端补以空格;若大于m,则按实际位数输出 %ld 长整型数据 %mld 指定字段宽 ...
- 几篇QEMU/KVM代码分析文章
QEMU/KVM结合起来分析的几篇文章,代码跟最新的版本有些差异,但大体逻辑一样,写得通俗易懂.我把链接放这里主要是为自己需要查看时调转过去方便,感谢作者的付出! QEMU Source Code S ...
- MVC上传多张图片
改变上传文件的按钮样式: <div id="post-upload-image"> <div id="divfile_-1"> < ...
- [未完结]数字微分分析法的直线绘制(DDA)
注意! 本文被第1次更新,可能存在后续更新 直线画法 直线的斜截式方程 在二维空间下,一条直线的方程可以被描述为若干种形式,其中比较常见的一种是斜截式方程: \[y=kx+b\] 其中\(k\)称为直 ...
- 程序基石系列之C++多态的前提条件
准备知识 C++中多态(polymorphism)有下面三个前提条件: 必须存在一个继承体系结构. 继承体系结构中的一些类必须具有同名的virtual成员函数(virtualkeyword) 至少有一 ...