HDU5709 Claris Loves Painting
题目
建两棵动态开点权值线段树。
一棵以颜色为下标,维护每种颜色出现的最浅深度。
一棵以深度为下标,维护以该深度为最浅深度的颜色有多少种。
然后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相关推荐
- HDU5709 : Claris Loves Painting
对于每个点维护两棵线段树$T1[x],T2[x]$: $T1[x]$维护$x$子树内,深度在$[l,r]$内的点数,同种颜色有多个的话,保留深度最小的那个. $T2[x]$维护$x$子树内每种颜色的最 ...
- [HDU5709]Claris Loves Painting
vjudge description 给定一棵\(n\)点的树,每个节点上有一个颜色,每次询问一个点的子树中与这个点距离不超过\(d\)的点的颜色有多少种.强制在线. sol 对每个点开两棵线段树,一 ...
- HDU - 5709 Claris Loves Painting 线段树动态开点+合并
题目链接:https://cn.vjudge.net/problem/HDU-5709 题意:给定一棵n点的树,每个节点上有一个颜色,每次询问一个点的子树中与这个点距离不超过d的点的颜色有多少种 题解 ...
- 5709 - Claris Loves Painting
给定一棵树,树上每个节点有一个颜色,每次询问以x节点为根的子树,深度小于等于d的部分共有几种颜色. 以下摘自胡主力的ppt: 先考虑一个弱化版,询问是询问一个结点的整棵子树的颜色数 先处理出树的dfs ...
- hdu5709-Claris Loves Painting【线段树合并】
正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5709 题目大意 nnn个点的一棵树,每次有询问(u,k)(u,k)(u,k)表在uuu的子树中, ...
- 巴卡斯杯 中国大学生程序设计竞赛 - 女生专场(重现)解题思路
此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场( ...
- stcoder Splatter Painting 记忆化搜索
5647: Splatter Painting 时间限制: 2 Sec 内存限制: 256 MB 提交: 32 解决: 16 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Sq ...
- AtCoder2362 - Splatter Painting - DFS+思维
1.题目描述: B - Splatter Painting Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem St ...
- mysql sql日期截取年月日_sql截取日期/时间的单独部分,比如年、月、日、小时、分钟等等...
可以使用EXTRACT() 函数.(oracle和mysql都有该函数) 语法: EXTRACT(unit FROM date) date 参数是合法的日期表达式.unit 参数可以是下列的值: YE ...
最新文章
- matlab风力机叶片仿真教程,我用matlab编写了一个风力机叶片的优化设计程序,有点问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...
- linux 回退乱码,如何在linux sqlplus 下实现方向健和回退键操作而避免乱码
- 暴走英雄坛html5游戏在线玩,暴走英雄坛h5
- 「递归」第8集 | 当敲代码的手开始写歌,玩跨界的程序员有多野?
- tomcat一闪而过
- MC新手入门(三十)------ 逻辑运算符和表达式
- python数据结构剑指offer-链表中环的入口结点
- Spring MVC 入门指南(二):@RequestMapping用法详解
- 美赛论文格式基本要求
- java 如何执行dig 命令_linux dig 命令使用方法
- uboot移植——uboot的硬件驱动部分
- 平流式隔油池计算_隔油池设计方案计算.doc
- 网站支付宝登录授权具体实现
- Pingouin: 基于pandas和numpy的统计包
- win11触控板用不了怎么办?win11触控板用不了的解决方法
- 匈牙利命名法鼻祖---查尔斯·西蒙尼
- 正则表达式在线生成工具
- 苹果cms简介和优点及最新更新地址
- VUE教程(持续更新中)
- 企业邮件服务器搭建之品牌形象塑造