题目链接

对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合并两棵颜色线段树时发现某种颜色重复,则在深度线段树上把较深的深度对应的位置-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. 网络管理常用命令(6/14) -netstat命令详解

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Membershi ...

  2. JavaScript与Java数据类型的区别

    今天开始正式认真学习js,虽然在平常j2ee开发中也经常用到JS但并不精通,这次随笔记下js与Java数据类型的不同之处 Number 与java不同,js作为弱类型语言即使在浮点数与整数上也未作明确 ...

  3. Entity FrameWork Code First常用知识

    1.Model属性类: [Key] //标识一个属性作为主键,即使它不符合类名+Id的格式. [MaxLength(500)] //限制一个字符串属性最多有多少字,其对应的数据表字段也会是nvarch ...

  4. Spring_IOC&DI概述

  5. JSR规范整理

    Web Service技术 Java Date与Time API ( JSR 310) Java API for RESTful Web Services (JAX-RS) 1.1 (JSR 311) ...

  6. 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes异常

    错误截图: 解决方法: 用root进入mysql终端,执行以下命令: alter database hive character set latin1;

  7. const作用

    const有以下几个作用: 1. 定义const常量,具有不可变性.eg. const int MAX = 100;  int Array[MAX]; 2. 进行类型检查,使编译器对处理内容有更多的了 ...

  8. server_2003_r2_standard_sp2_vl_X13-46532

    1. 安装的是 cn_win_srv_2003_r2_standard_with_sp2_vl_cd1_X13-46532.iso CD2 它没有要求装 也就没装,貌似 网上搜到 安装CD2需要另外的 ...

  9. mybatis报错 Error instantiating interface com.atguigu.mybatis.dao.DepartmentMapper with invalid types () or values ()

    mybatis报错 Error instantiating interface com.atguigu.mybatis.dao.DepartmentMapper with invalid types ...

  10. spring3: 访问Resource — ResourceLoader/ResourceLoaderAware接口

    4.3.1  ResourceLoader接口 ResourceLoader接口用于返回Resource对象:其实现可以看作是一个生产Resource的工厂类. public interface Re ...