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> ...
随机推荐
- 【mysql中myisam和innodb的区别】
单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...
- ytu 1059: 判别该年份是否闰年(水题,宏定义)
1059: 判别该年份是否闰年 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 222 Solved: 139[Submit][Status][Web ...
- Oracle【IT实验室】数据库备份与恢复之二:SQL*Loader
2.1 基本知识 Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中.通常 与 SPOOL导出文本数据方法配合使用. 1.命令格式 SQLLDR keyw ...
- C#屏幕截图
今天通过C#来实现一个简单的屏幕截图功能.实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度.然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截 ...
- PMP 第一章 引论
1 项目的特点 独特性 临时性 但创造的成果一般和其特点相反. 2 什么是项目管理? 什么是项目? 项目管理就是将知识 技能 工具与技术应用于项目活动,以满足项目的要求,达到项目的目的. 项目管理通过 ...
- win8.1/win10 UEFI + GPT 安装(测试机型:华硕S56CM)
本教程简要介绍在UEFI 启动模式下在GPT分区表中,最简单的方法安装 Windows 10 x64 位系统.(并非傻瓜教程,安装者总要有一定的经验基础)下面先简单介绍一下UEFI和GTP. UEFI ...
- hibernate base
第一个类:Person.java package org.crazyit.app.domain; import java.io.Serializable;import java.util.ArrayL ...
- 在Salesforce中创建Web Service供外部系统调用
在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...
- 在Salesforce中处理Xml的生成与解析
在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...
- Arduino101学习笔记(九)—— 中断函数
1.设置中断函数 //***************************************************************************************** ...