题目链接

对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合并两棵颜色线段树时发现某种颜色重复,则在深度线段树上把较深的深度对应的位置-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. 《网络攻防》Web安全基础实践

    20145224陈颢文 <网络攻防>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御: 部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,黑客利用这个bug在数 ...

  2. Oracle数据库PLSQL的中文乱码显示全是问号

    plsql连接数据库乱码问题 缘由: 小师妹周末叫我帮她重装数据库,这么大好的周末时光不出去玩儿,给她装数据库这不是很蛋疼么. 我问她为什么要重装,她说:数据存入数据库后,中文字符有乱码,一定是我上次 ...

  3. 程序包com.sun.istack.internal不存在

    添加一下依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency> ...

  4. 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let

    转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...

  5. jvm-java内存模型与锁优化

    java内存模型与锁优化 参考: https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/53143355 https://blog.csd ...

  6. CNNIC成为首家UASG中国联络站

    1月29日,在“2018中国域名大会暨中国互联网络信息中心(CNNIC)行业合作伙伴年会”上获悉,CNNIC日前正式完成与互联网名称与数字地址分配机构(ICANN)的签约,成为首家UASG(普遍接受指 ...

  7. springBean集合注入的方法

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  8. JQuery -- Dom操作, 示例代码

    1.内部插入节点 *   append(content) :向每个匹配的元素的内部的结尾处追加内容 *   appendTo(content) :将每个匹配的元素追加到指定的元素中的内部结尾处 *   ...

  9. Remove Duplicates from Sorted List ,除去链表中相邻的重复元素

    Remove Duplicates from Sorted List : Given a sorted linked list, delete all duplicates such that eac ...

  10. Java中的equals学习小结

    Java中的equals是十分重要的,和= =要区别开来,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式    public  boolean equals ...