BZOJ - 4771 七彩树 (可持久化线段树合并)
对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合并两棵颜色线段树时发现某种颜色重复,则在深度线段树上把较深的深度对应的位置-1。
注意由于强制在线,深度线段树的合并以及更新都需要可持久化。
(ps:不能用map代替颜色线段树,会TLE~~)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+;
int n,m,hd[N],ne,rt1[N],rt2[N],tot1,tot2,a[N],dep[N];
struct E {int v,nxt;} e[N];
struct D1 {int ls,rs,x;} tr1[N*];
struct D2 {int ls,rs,x;} tr2[N*];
void addedge(int u,int v) {e[ne]= {v,hd[u]},hd[u]=ne++;}
#define mid ((l+r)>>1)
int newnode1() {tr1[++tot1]= {,,}; return tot1;}
int newnode2() {tr2[++tot2]= {,,}; return tot2;}
void upd1(int& u,int p,int x,int l=,int r=n) {
if(!u)u=newnode1();
if(l==r) {tr1[u].x=x; return;}
p<=mid?upd1(tr1[u].ls,p,x,l,mid):upd1(tr1[u].rs,p,x,mid+,r);
}
void upd2(int& w,int u,int p,int x,int l=,int r=n) {
w=newnode2();
tr2[w].x=tr2[u].x+x;
if(l==r)return;
if(p<=mid)upd2(tr2[w].ls,tr2[u].ls,p,x,l,mid),tr2[w].rs=tr2[u].rs;
else upd2(tr2[w].rs,tr2[u].rs,p,x,mid+,r),tr2[w].ls=tr2[u].ls;
}
void mg1(int uu,int& u,int v,int l=,int r=n) {
if(!u) {u=v; return;}
if(!v)return;
if(l==r) {
if(!tr1[u].x)tr1[u].x=tr1[v].x;
else if(!tr1[v].x);
else {
int mx=max(tr1[u].x,tr1[v].x),mi=min(tr1[u].x,tr1[v].x);
upd2(rt2[uu],rt2[uu],mx,-),tr1[u].x=mi;
}
return;
}
mg1(uu,tr1[u].ls,tr1[v].ls,l,mid);
mg1(uu,tr1[u].rs,tr1[v].rs,mid+,r);
}
void mg2(int& w,int u,int v,int l=,int r=n) {
if(!u) {w=v; return;}
if(!v) {w=u; return;}
w=newnode2();
tr2[w].x=tr2[u].x+tr2[v].x;
if(l==r)return;
mg2(tr2[w].ls,tr2[u].ls,tr2[v].ls,l,mid);
mg2(tr2[w].rs,tr2[u].rs,tr2[v].rs,mid+,r);
}
void dfs(int u,int d) {
rt1[u]=rt2[u]=,dep[u]=d;
upd1(rt1[u],a[u],dep[u]),upd2(rt2[u],rt2[u],dep[u],);
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
dfs(v,d+);
mg1(u,rt1[u],rt1[v]);
mg2(rt2[u],rt2[u],rt2[v]);
}
}
int qry(int u,int L,int R,int l=,int r=n) {
if(l>=L&&r<=R)return tr2[u].x;
if(l>R||r<L)return ;
return qry(tr2[u].ls,L,R,l,mid)+qry(tr2[u].rs,L,R,mid+,r);
}
int main() {
int T;
for(scanf("%d",&T); T--;) {
memset(hd,-,sizeof hd),ne=tot1=tot2=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)scanf("%d",&a[i]);
for(int i=; i<=n; ++i) {
int f;
scanf("%d",&f);
addedge(f,i);
}
dfs(,);
for(int ans=; m--;) {
int u,d;
scanf("%d%d",&u,&d),u^=ans,d^=ans;
printf("%d\n",ans=qry(rt2[u],,min(dep[u]+d,n)));
}
}
return ;
}
BZOJ - 4771 七彩树 (可持久化线段树合并)的更多相关文章
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
- BZOJ 4771: 七彩树 可持久化线段树+树链的并
这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #incl ...
- BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA
给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- bzoj 2653 二分答案+可持久化线段树
首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
随机推荐
- Java伪代码示例
学习并转载自https://www.cnblogs.com/z245894546/p/7535261.html import.java.大道至简.*; import.java.愚公移山.*; publ ...
- 使用Linq to XML 修改app.config
使用其他的方法修改app.config无效.而且修改的是*.vshost.exe.Config,程序运行时正常,关闭之后就还是原来的值. Configuration configuration = C ...
- vuex初使用
- Mybatis常见问题
1.#和$的区别和联系 1.1#是占位符,会对Sql进行预编译,相当于?:$是做Sql拼接,有sql注入的隐患 1.2#不需要关注数据类型,Mybatis自动实现类型转换,$必须自己判断数据类型联系 ...
- 20 个 OpenSSH 最佳安全实践
来源:https://linux.cn/article-9394-1.html OpenSSH 是 SSH 协议的一个实现.一般通过 scp 或 sftp 用于远程登录.备份.远程文件传输等功能.SS ...
- idea发布到tomcat缺少jar
主要是需要自己添加jar到artifact,如果单个添加jar,则在右边栏右键选择 如果是把整个lib添加到toamcat发布,则选择下面的提示:
- Redis 后台运行
编辑配置文件 vim {redis_home}/redis.conf 修改daemonize (默认为no,修改为yes) 启动redis{redis_home}/src/redis-server ...
- 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
概念和区别 SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS ...
- qtjambi_ZC
loadJambiJniLibrary --> loadLibrary --> loadNativeLibrary --> loadLibrary_helper class QApp ...
- Hypernetes简介——真正多租户的Kubernetes Distro
http://www.dockone.io/article/838 Hypernetes是一个真正多租户的Kubernetes Distro. Hypernetes在Kubernetes基础上增加了多 ...