4154: [Ipsc2015]Generating Synergy
Description
给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色
区间修改单点查询kdtree
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#define LL long long
using namespace std;
const int P=1e9+7;
const int M=100005;
struct vv{ int c,l,r,mx[2],mn[2],d[2],tag,D; } t[M];
int n,m,k,a[M],C,D,X1,Y1,X2,Y2,x,y,z;
int dfn[M],s[M],dp[M],f[M],T,root;
int ver[M],edge[M],nex[M],head[M],cnt,res;
void add(int x,int y)
{
ver[++cnt]=y, nex[cnt]=head[x], head[x]=cnt;
}
void dfs(int x)
{
dfn[x]=++cnt; dp[x]=dp[f[x]]+1; s[x]=1;
for(int i=head[x];i;i=nex[i]) dfs(ver[i]), s[x]+=s[ver[i]];
}
bool cmp(vv a,vv b)
{
return a.d[D]==b.d[D]?a.d[!D]<b.d[!D] : a.d[D]<b.d[D];
}
void update(int now)
{
if(t[now].l)
{
t[now].mn[0]=min(t[now].mn[0], t[t[now].l].mn[0]);
t[now].mn[1]=min(t[now].mn[1], t[t[now].l].mn[1]);
t[now].mx[0]=max(t[now].mx[0], t[t[now].l].mx[0]);
t[now].mx[1]=max(t[now].mx[1], t[t[now].l].mx[1]);
}
if(t[now].r)
{
t[now].mn[0]=min(t[now].mn[0], t[t[now].r].mn[0]);
t[now].mn[1]=min(t[now].mn[1], t[t[now].r].mn[1]);
t[now].mx[0]=max(t[now].mx[0], t[t[now].r].mx[0]);
t[now].mx[1]=max(t[now].mx[1], t[t[now].r].mx[1]);
}
}
void pd(int now)
{
if(!t[now].tag) return ;
if(t[now].l) t[t[now].l].tag=t[t[now].l].c=t[now].tag;
if(t[now].r) t[t[now].r].tag=t[t[now].r].c=t[now].tag;
t[now].tag=0;
}
int built(int l,int r,int d)
{
D=rand()&1; int mid=(l+r)>>1;
nth_element(t+l,t+mid,t+r+1,cmp);
t[mid].tag=0; t[mid].c=1; t[mid].l=t[mid].r=0; t[mid].D=D;
if(l<mid) t[mid].l=built(l,mid-1,!d);
if(mid<r) t[mid].r=built(mid+1,r,!d);
update(mid);
return mid;
}
void mody(int now,int c)
{
if(X1<=t[now].mn[0] && X2>=t[now].mx[0] && Y1<=t[now].mn[1] && Y2>=t[now].mx[1])
{
t[now].tag=t[now].c=c; return ;
}
if(X1>t[now].mx[0] || X2<t[now].mn[0] || Y1>t[now].mx[0] || Y2<t[now].mn[1]) return;
pd(now);
if(t[now].d[0]>=X1 && t[now].d[0]<=X2 && t[now].d[1]>=Y1 && t[now].d[1]<=Y2) t[now].c=c;
if(t[now].l) mody(t[now].l,c);
if(t[now].r) mody(t[now].r,c);
}
int ask(int now,int x,int y,int d)
{
if(t[now].tag) return t[now].tag; d=t[now].D;
if(t[now].d[0]==x && t[now].d[1]==y) return t[now].c;
if(!d)
{
if(x<t[now].d[0] || (x==t[now].d[0] && y<t[now].d[1])) return ask(t[now].l,x,y,!d);
else return ask(t[now].r,x,y,!d);
}
else
{
if(y<t[now].d[1] || (y==t[now].d[1] && x<t[now].d[0])) return ask(t[now].l,x,y,!d);
else return ask(t[now].r,x,y,!d);
}
}
int main()
{
srand(time(0));
scanf("%d",&T);
for(;T;T--)
{
memset(nex,0,sizeof(nex));
memset(head,0,sizeof(head));
cnt=0;
scanf("%d%d%d",&n,&C,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&f[i]);
add(f[i],i);
}
dp[1]=1;cnt=0; dfs(1);
for(int i=1;i<=n;i++)
{
t[i].d[0]=t[i].mx[0]=t[i].mn[0]=dfn[i];
t[i].d[1]=t[i].mx[1]=t[i].mn[1]=dp[i];
}
root=built(1,n,0);
LL res=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(!z) res=(res+1ll*i*ask(root,dfn[x],dp[x],0))%P;
else
{
X1=dfn[x], X2=dfn[x]+s[x]-1, Y1=dp[x], Y2=dp[x]+y;
mody(root,z);
}
}
printf("%lld\n",res);
}
}
4154: [Ipsc2015]Generating Synergy的更多相关文章
- BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序
多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...
- 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree
[BZOJ4154][Ipsc2015]Generating Synergy Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问 ...
- 【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
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,表示数据组数 接下来每组数据的第一行三 ...
- 【bzoj4154】[Ipsc2015]Generating Synergy KD-tree
题目描述 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 输入 第一行一个数T,表示数据组数 接下来每组数据的第一行三个数n,c,q表示结 ...
- [bzoj4154][Ipsc2015]Generating Synergy_KD-Tree_dfs序
Generating Synergy bzoj-4154 Ipsc-2015 题目大意:给定一棵n个节点树,m个操作,支持:将一个点周围所有距该点距离不超过l的子结点的颜色改成另一种颜色:查询单点颜色 ...
随机推荐
- 安装vue开发环境→安装淘宝镜像的时候报错
问题: npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid ...
- docker-container 操作
1.把container放后台运行 [root@localhost dockerfile3]# docker run bigni/python_flask #默认运行image,container里运 ...
- 对struct typedef *的认识
typedef struct node { ……… }NODE,*PNODE; 应该等价于 typedef struct node NODE;//struct node = NODE,eg:struc ...
- Electron-vue实战(三)— 如何在Vuex中管理Mock数据
Electron-vue实战(三)— 如何在Vuex中管理Mock数据 作者:狐狸家的鱼 本文链接:Vuex管理Mock数据 GitHub:sueRimn 在vuex中管理mock数据 关于vuex的 ...
- Python和 pytest的异常处理
Python中有自带的异常处理 try: except: pytest中 1.可以用try except来处理,来保证出错后,把后面的语句执行完成: 2.当有多条用例需要跑完时,不需要考虑其中一条用例 ...
- [REPRINT] Java 101: Classes and objects in Java
http://www.javaworld.com/article/2979739/learn-java/java-101-classes-and-objects-in-java.html?page=3 ...
- 【leetcode】924.Minimize Malware Spread
题目如下: In a network of nodes, each node i is directly connected to another node j if and only if grap ...
- for循环语句示例
for循环语句示例 一判断/var/目录下所有文件的类型 完整脚本 [root@centos73 ~]# cat shell_scripts/filetype.sh #!/bin/bash #Auth ...
- 使用vue完成一个分页效果
基于 element-ui 分页组件实现分页效果 效果如下: 使用说明: 0.首先在头部引入需要的外部文件 1.从element官方网页中复制想要的组件代码直接放入body中 2.编写逻辑代码 3.完 ...
- jquery实现简单的搜索功能
管理系统中需要实现导航列表的搜索功能,写了一个简单的小栗子: <!DOCTYPE html> <html lang="en"> <head> & ...