题目链接

对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合并两棵颜色线段树时发现某种颜色重复,则在深度线段树上把较深的深度对应的位置-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 七彩树 (可持久化线段树合并)的更多相关文章

  1. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  2. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  3. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  4. BZOJ 4771: 七彩树 可持久化线段树+树链的并

    这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #incl ...

  5. BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA

    给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...

  6. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  7. bzoj 2653 二分答案+可持久化线段树

    首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...

  8. BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树

    题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...

  9. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  10. 主席树[可持久化线段树](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 ...

随机推荐

  1. netty应用

    http://www.blogjava.net/yongboy/archive/2013/05/13/399203.html http://shentar.me/tag/netty-2/ 代理 htt ...

  2. jmeter常用插件安装

    转载:http://www.cnblogs.com/danqiu/p/6119156.html 下载地址:http://jmeter-plugins.org/downloads/all/ PerfMo ...

  3. 笔记1:Jmeter工作原理及目录结构

    1.基本工作原理 发送request请求到服务器——获取目标服务的统计信息——生成不同格式的报告 2.完整的工作原理 Jmeter模拟用户并发进行性能测试——发送request到目标服务器——服务器返 ...

  4. Spring 之通过 XML 装配 bean

    1.关于 使用传统标签还是 c- p- 命名空间定义的标签, 我的观点是能用  c- p- 命名空间定义的标签 就不用 传统标签(这样会比较简洁... 2.强依赖使用构造器注入,可选性依赖使用属性注入 ...

  5. 防止CSRF的攻击—Origin和Referer

    防止CSRF的攻击—Origin和Referer 为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的 ...

  6. redis_入门网址

    redis中文网: http://www.redis.cn/ 可以 试用 以及 下载 redis百度百科:http://baike.baidu.com/link?url=MEkE5MpGAOfJ7ci ...

  7. zabbix邮件报警变量表

    常用变量值 默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障! 默认信息: 告警主机:{HOSTNAME1} 告警时间:{EVE ...

  8. UVA 10214 Trees in a Wood(欧拉函数)

    题意:给你a.b(a<=2000,b<=2000000),问你从原点可以看到范围在(-a<=x<=a,-b<=y<=b)内整数点的个数 题解:首先只需要计算第一象限 ...

  9. Javascript -- 级联菜单, javascript解析xml文件

    1. cities.xml 保存省份和城市 <?xml version="1.0" encoding="GB2312"?> <china> ...

  10. tyvj 1067 合唱队形 dp LIS

    P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N ...