题目
建两棵动态开点权值线段树。
一棵以颜色为下标,维护每种颜色出现的最浅深度。
一棵以深度为下标,维护以该深度为最浅深度的颜色有多少种。
然后dfs的时候启发式合并线段树即可。

#include<bits/stdc++.h>
#define mid ((l+r)>>1)
#define pb push_back
using namespace std;
namespace IO
{char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}void Put(char x){*oS++=x;if(oS==oT)Flush();}int read(){int x=0;char ch=Get();while(ch>57||ch<48)ch=Get();while(ch>=48&&ch<=57)x=x*10+(ch^48),ch=Get();return x;}void write(int x){int top=0;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
int min(int a,int b){return a<b? a:b;}
int max(int a,int b){return a>b? a:b;}
const int N=100007;
int col[N],nxt[N],head[N],root1[N],root2[N],dep[N],ans,n,m,cnt;
struct node{int l,r,x;}t[N*100];
vector<int>G[N];
void build(int &p,int l,int r,int x,int v)
{p=++cnt;if(l==r) return t[p].x=v,void();x<=mid? build(t[p].l,l,mid,x,v):build(t[p].r,mid+1,r,x,v);
}
void update(int &p,int l,int r,int x,int v)
{t[++cnt]=t[p],t[p=cnt].x+=v;if(l==r) return ;x<=mid? update(t[p].l,l,mid,x,v):update(t[p].r,mid+1,r,x,v);
}
int query(int p,int l,int r,int L,int R)
{if(L<=l&&r<=R) return t[p].x;return (L<=mid? query(t[p].l,l,mid,L,R):0)+(R>mid? query(t[p].r,mid+1,r,L,R):0);
}
int merge1(int u,int v,int l,int r,int x)
{if(!u||!v) return u|v;int p=++cnt;if(l==r) t[p].x=min(t[u].x,t[v].x),update(root2[x],1,n,max(t[u].x,t[v].x),-1);t[p].l=merge1(t[u].l,t[v].l,l,mid,x),t[p].r=merge1(t[u].r,t[v].r,mid+1,r,x);return p;
}
int merge2(int u,int v)
{if(!u||!v) return u|v;int p=++cnt;t[p]=(node){merge2(t[u].l,t[v].l),merge2(t[u].r,t[v].r),t[u].x+t[v].x};return p;
}
void dfs(int u)
{build(root1[u],1,n,col[u],dep[u]),update(root2[u],1,n,dep[u],1);for(int i=0,v;i<G[u].size();++i) dep[v=G[u][i]]=dep[u]+1,dfs(v),root1[u]=merge1(root1[u],root1[v],1,n,u),root2[u]=merge2(root2[u],root2[v]);
}
int main()
{for(int T=read(),i,x,d,ans;T;--T){n=read(),m=read(),ans=0;for(i=1;i<=cnt;++i) t[i]=(node){0,0,0};for(cnt=0,i=1;i<=n;++i) col[i]=read(),root1[i]=root2[i]=0,G[i].clear();for(i=2;i<=n;++i) x=read(),G[x].pb(i);dep[1]=1;dfs(1);while(m--) x=read()^ans,d=read()^ans,write(ans=query(root2[x],1,n,dep[x],dep[x]+d));}return Flush(),0;
}

转载于:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11558065.html

HDU5709 Claris Loves Painting相关推荐

  1. HDU5709 : Claris Loves Painting

    对于每个点维护两棵线段树$T1[x],T2[x]$: $T1[x]$维护$x$子树内,深度在$[l,r]$内的点数,同种颜色有多个的话,保留深度最小的那个. $T2[x]$维护$x$子树内每种颜色的最 ...

  2. [HDU5709]Claris Loves Painting

    vjudge description 给定一棵\(n\)点的树,每个节点上有一个颜色,每次询问一个点的子树中与这个点距离不超过\(d\)的点的颜色有多少种.强制在线. sol 对每个点开两棵线段树,一 ...

  3. HDU - 5709 Claris Loves Painting 线段树动态开点+合并

    题目链接:https://cn.vjudge.net/problem/HDU-5709 题意:给定一棵n点的树,每个节点上有一个颜色,每次询问一个点的子树中与这个点距离不超过d的点的颜色有多少种 题解 ...

  4. 5709 - Claris Loves Painting

    给定一棵树,树上每个节点有一个颜色,每次询问以x节点为根的子树,深度小于等于d的部分共有几种颜色. 以下摘自胡主力的ppt: 先考虑一个弱化版,询问是询问一个结点的整棵子树的颜色数 先处理出树的dfs ...

  5. hdu5709-Claris Loves Painting【线段树合并】

    正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5709 题目大意 nnn个点的一棵树,每次有询问(u,k)(u,k)(u,k)表在uuu的子树中, ...

  6. 巴卡斯杯 中国大学生程序设计竞赛 - 女生专场(重现)解题思路

    此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场( ...

  7. stcoder Splatter Painting 记忆化搜索

    5647: Splatter Painting 时间限制: 2 Sec  内存限制: 256 MB 提交: 32  解决: 16 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Sq ...

  8. AtCoder2362 - Splatter Painting - DFS+思维

    1.题目描述: B - Splatter Painting Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem St ...

  9. mysql sql日期截取年月日_sql截取日期/时间的单独部分,比如年、月、日、小时、分钟等等...

    可以使用EXTRACT() 函数.(oracle和mysql都有该函数) 语法: EXTRACT(unit FROM date) date 参数是合法的日期表达式.unit 参数可以是下列的值: YE ...

最新文章

  1. matlab风力机叶片仿真教程,我用matlab编写了一个风力机叶片的优化设计程序,有点问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...
  2. linux 回退乱码,如何在linux sqlplus 下实现方向健和回退键操作而避免乱码
  3. 暴走英雄坛html5游戏在线玩,暴走英雄坛h5
  4. 「递归」第8集 | 当敲代码的手开始写歌,玩跨界的程序员有多野?
  5. tomcat一闪而过
  6. MC新手入门(三十)------ 逻辑运算符和表达式
  7. python数据结构剑指offer-链表中环的入口结点
  8. Spring MVC 入门指南(二):@RequestMapping用法详解
  9. 美赛论文格式基本要求
  10. java 如何执行dig 命令_linux dig 命令使用方法
  11. uboot移植——uboot的硬件驱动部分
  12. 平流式隔油池计算_隔油池设计方案计算.doc
  13. 网站支付宝登录授权具体实现
  14. Pingouin: 基于pandas和numpy的统计包
  15. win11触控板用不了怎么办?win11触控板用不了的解决方法
  16. 匈牙利命名法鼻祖---查尔斯·西蒙尼
  17. 正则表达式在线生成工具
  18. 苹果cms简介和优点及最新更新地址
  19. VUE教程(持续更新中)
  20. 企业邮件服务器搭建之品牌形象塑造

热门文章

  1. (JAVA)从键盘输入
  2. eclipse反编译插件jadclipse安装
  3. SQL外连接之交集、并集、差集查询
  4. ipad上自定义view的旋转适配
  5. ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介
  6. 如何在人群中快速识别一个程序员...
  7. 局部解剖学试题及答案
  8. MFC过时了吗?初学者远离?QT取代?QT/MFC对比
  9. Android好书推荐:《Google Android SDK开发范例》
  10. EasyExcel导出表格——下拉筛选