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
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
#define L T[o].lc
#define R T[o].rc
using namespace std;
const int BufferSize=<<;
const int inf=1e9;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=,f=;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-;
for(;isdigit(c);c=Getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
int D,rt,pos[maxn];
struct Node {
int x[],mx[],mn[],setv,c;
int lc,rc,id,fa;
bool operator < (const Node& ths) const {return x[D]<ths.x[D];}
}P[maxn],T[maxn];
int n,c,q,first[maxn],next[maxn],to[maxn],st[maxn],en[maxn],dep[maxn],e,ToT;
void AddEdge(int u,int v) {
to[++e]=v;next[e]=first[u];first[u]=e;
}
void dfs(int x) {
P[x].x[]=st[x]=++ToT;P[x].x[]=dep[x];P[x].id=x;
ren dep[to[i]]=dep[x]+,dfs(to[i]);
en[x]=ToT;
}
void build(int& o,int l,int r,int c) {
o=;
if(l>r) return;
int mid=l+r>>;o=mid;D=c;
nth_element(P+l,P+mid,P+r+);
T[o]=P[mid];T[o].setv=T[o].c=;pos[P[mid].id]=mid;
build(L,l,mid-,c^);build(R,mid+,r,c^);
T[L].fa=T[R].fa=o;
T[o].mn[]=min(T[o].x[],min(T[L].mn[],T[R].mn[]));
T[o].mn[]=min(T[o].x[],min(T[L].mn[],T[R].mn[]));
T[o].mx[]=max(T[o].x[],max(T[L].mx[],T[R].mx[]));
T[o].mx[]=max(T[o].x[],max(T[L].mx[],T[R].mx[]));
// printf("%d %d %d %d %d\n",T[o].mn[0],T[o].mx[0],T[o].mn[1],T[o].mx[1],o);
}
void set(int o,int val) {if(o) T[o].setv=T[o].c=val;}
void pushdown(int o) {
if(!T[o].setv) return;
set(L,T[o].setv);set(R,T[o].setv);
T[o].setv=;
}
int in(int o,int x1,int x2,int y1,int y2) {return T[o].mn[]>=x1&&T[o].mx[]<=x2&&T[o].mn[]>=y1&&T[o].mx[]<=y2;}
int out(int o,int x1,int x2,int y1,int y2) {return T[o].mn[]>x2||T[o].mx[]<x1||T[o].mn[]>y2||T[o].mx[]<y1;}
void modify(int o,int x1,int x2,int y1,int y2,int val) {
if(!o) return;pushdown(o);
if(in(o,x1,x2,y1,y2)) {set(o,val);return;}
if(out(o,x1,x2,y1,y2)) return;
if(T[o].x[]>=x1&&T[o].x[]<=x2&&T[o].x[]>=y1&&T[o].x[]<=y2) T[o].c=val;
if(!out(L,x1,x2,y1,y2)) modify(L,x1,x2,y1,y2,val);
if(!out(R,x1,x2,y1,y2)) modify(R,x1,x2,y1,y2,val);
}
int S[maxn],top;
void solve() {
n=read();c=read();q=read();
fill(first+,first+n+,);e=ToT=rt=;
rep(i,,n) AddEdge(read(),i);
dfs();build(rt,,n,);
long long res=;
rep(i,,q) {
int x=read(),l=read(),t=read(),ans=;
if(t) modify(rt,st[x],en[x],dep[x],dep[x]+l,t);
else {
int o=pos[x];
while(o!=rt) S[++top]=T[o].fa,o=T[o].fa;
while(top) pushdown(S[top--]);
ans=T[pos[x]].c;
}
(res+=(long long)ans*i)%=;
}
printf("%lld\n",res);
}
int main() {
T[].mn[]=T[].mn[]=inf;
T[].mx[]=T[].mx[]=-inf;
dwn(T,read(),) solve();
return ;
}
BZOJ4154: [Ipsc2015]Generating Synergy的更多相关文章
- 【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 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
浅谈\(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
题目 大概已经掌握熟练码出\(kdt\)的技能了 发现距离子树根节点\(x\)不超过\(l\)的点可以用两种方式来限制,首先\(dfs\)序在\([dfn_x,dfn_x+sum_x)\)中,深度自然 ...
- 【BZOJ4154】Generating Synergy【kd树】
题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...
- BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序
多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...
随机推荐
- java中文乱码解决方法汇总
public static void main(String[] argv){ try { System.out.println(“中文”);//1 ...
- 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)
一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...
- PHPCMS 实现上一篇下一篇的几种方法
1第一种 <p>上一篇:{get sql = "select contentid,catid,url,titlee from phpcms_content where conte ...
- Java Web 项目获取运行时路径 classpath
假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是class ...
- c文件操作 (转)
文件文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等 ...
- ☆ ☆ VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程 (转)
参考 http://diybbs.zol.com.cn/1/34037_699.html 然后对安装的Mac系统进行升级到最新版本. 安装mac系统之后,再安装VMTOOLS darwin. 方法可 ...
- HeapSort自己yy-未完成
#include <iostream> #include <cstdio> using namespace std; ; int a[maxn]; int HeapSize; ...
- python 的特殊方法 __str__和__repr__
__str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, name, ...
- Liferay 6.2 改造系列之二:清理不需要的Portlet
一.特殊Portlet: 以下Portlet数据特殊用途的Portlet,去除后会出现运行错误: 1.站点模版 通过com.liferay.portal.events.AddDefaultLayout ...
- Android Manifest 权限描述大全
权限 名称 描述 android.permission.ACCESS_CHECKIN_PROPERTIES 访问登记属性 读取或写入登记check-in数据库属性表的权限 android.permis ...