HDU5709 : Claris Loves Painting
对于每个点维护两棵线段树$T1[x],T2[x]$:
$T1[x]$维护$x$子树内,深度在$[l,r]$内的点数,同种颜色有多个的话,保留深度最小的那个。
$T2[x]$维护$x$子树内每种颜色的最小深度。
从底向上合并线段树,先合并$T1$,然后合并$T2$的时候,发现有重复点,那么在$T1$里删去深度大的那个,查询直接在$T1$里区间求和即可。
时间复杂度$O((n+m)\log n)$。
#include<cstdio>
const int N=100010,M=10000000;
int Case,n,m,i,x,y,ans,a[N],f[N],d[N],T1[N],T2[N],tot,l[M],r[M],v[M];
int ins(int x,int a,int b,int c,int p){
int y=++tot;v[y]=v[x]+p;
if(a==b)return y;
int mid=(a+b)>>1;
if(c<=mid)l[y]=ins(l[x],a,mid,c,p),r[y]=r[x];
else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c,p);
return y;
}
int merge1(int x,int y,int a,int b){
if(!x||!y)return x+y;
int z=++tot;
v[z]=v[x]+v[y];
if(a==b)return z;
int mid=(a+b)>>1;
l[z]=merge1(l[x],l[y],a,mid);
r[z]=merge1(r[x],r[y],mid+1,b);
return z;
}
int merge2(int x,int y,int a,int b,int p){
if(!x||!y)return x+y;
int z=++tot;
if(a==b){
if(v[x]<v[y])v[z]=v[x],T1[p]=ins(T1[p],1,n,v[y],-1);
else v[z]=v[y],T1[p]=ins(T1[p],1,n,v[x],-1);
return z;
}
int mid=(a+b)>>1;
l[z]=merge2(l[x],l[y],a,mid,p);
r[z]=merge2(r[x],r[y],mid+1,b,p);
return z;
}
int ask(int x,int a,int b,int d){
if(b<=d)return v[x];
int mid=(a+b)>>1,t=ask(l[x],a,mid,d);
if(d>mid)t+=ask(r[x],mid+1,b,d);
return t;
}
int main(){
scanf("%d",&Case);
while(Case--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=2;i<=n;i++)scanf("%d",&f[i]);
for(i=1;i<=n;i++)d[i]=d[f[i]]+1;
for(i=1;i<=n;i++){
T1[i]=ins(0,1,n,d[i],1);
T2[i]=ins(0,1,n,a[i],d[i]);
}
for(i=n;i>1;i--){
T1[f[i]]=merge1(T1[f[i]],T1[i],1,n);
T2[f[i]]=merge2(T2[f[i]],T2[i],1,n,f[i]);
}
while(m--){
scanf("%d%d",&x,&y);x^=ans,y^=ans;
y+=d[x];
if(y>n)y=n;
printf("%d\n",ans=ask(T1[x],1,n,y));
}
ans=tot=0;
}
return 0;
}
HDU5709 : Claris Loves Painting的更多相关文章
- [HDU5709]Claris Loves Painting(动态开点线段树+合并)
题意:有n(<=1e5)个点的树,每个点都有颜色(颜色可能重复),有m(<=1e5)个询问,每次询问(x,d)问在x的子树中,与x的距离不超过d的节点有多少种不同的颜色.强制要求在线. 分 ...
- hdu5709Claris Loves Painting主席树 奇妙的DFS序
先不考虑层数限制 一棵树上每个点有个颜色,问一棵子树的颜色数 感觉简单多了是吧 考虑每个点的贡献:自己到根的路径上的一个包含自己的连续段 观察最顶端的点的父亲: 它满足有了额外的同色孩子(咦) 这一条 ...
- [学习笔记]dsu on a tree(如何远离线段树合并)
https://www.zybuluo.com/ysner/note/1318613 背景 这玩意来源于一种有局限性的算法. 有一种广为人知的,树上离线维护子树信息的做法. (可以参照luogu360 ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces444C DZY Loves Colors(线段树)
题目 Source http://codeforces.com/problemset/problem/444/C Description DZY loves colors, and he enjoys ...
- BC之Claris and XOR
http://acm.hdu.edu.cn/showproblem.php?pid=5661 Claris and XOR Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 5661 Claris and XOR
Claris and XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- hdu-4810 Wall Painting(组合数学)
题目链接: Wall Painting Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 4810 Wall Painting
Wall Painting Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- 关于HTML5在动画制作工具Animatron的一些问题
Animatron是国外一款在线HTML5动画制作工具,网址:www.animatron.com 当然,想使用的话,是需要FQ的. 用animatron制作好的动画是可以下载为代码和GIF的,这时候付 ...
- eclipse使用时jar不在libraries
jar是在项目工程的目录下 点击工程右键 这样jar包边收到librarles中
- yii2.0框架安装心得
yii2.0安装心得 能够搜索到这篇文章的朋友相信是对yii框架有兴趣的,但是我不得不吐槽的是,这个安装过程确实让人头疼,接下来就让大家见证一下这个纠结的过程 根据官网的说法,安装这个框架需要用到co ...
- 如何做好App的引导页?(转)
http://uedc.163.com/12264.html 当你第一次打开一款应用的时候常常会看到精美的引导页设计,它们在你未使用产品之前提前告知你产品的主要功能与特点,第一次印象的好坏会极大地影响 ...
- RESTful架构入门
理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful RESTful API 设计指南 - 阮一峰的网络日志http ...
- Flex导出excel报表
sheetToExcel.java 1 package tree; 2 import java.io.BufferedInputStream; 3 import java.io.File; 4 imp ...
- linux 下解压rar文件
今天遇到要在linux 服务器上解压几个rar 文件的问题,rar似乎是win 专属的压缩格式,所以linux 原生工具链中并没有支持rar 解压的工具.经过一系列搜索确定了一个脚linuxrar 的 ...
- IBM AppScan 安全扫描:加密会话(SSL)Cookie 中缺少 Secure 属性 处理办法 分类: 数据安全 2014-06-28 11:35 2805人阅读 评论(0) 收藏
问题描述: 原因分析: 服务器开启了Https时,cookie的Secure属性应设为true: 解决办法: 1.服务器配置Https SSL方式,参考:https://support.micro ...
- Oracle ASM
一 Oracle ASM簡介 Oracle 10g推出的管理磁盤的新方式,用於取代LVM技術.主要用于RAC環境 二 Oracle ASM的配置安裝 1.安裝asm包 RedHat Linux5.x ...
- golang channel buffer
package mainimport ( "fmt" "time")func main() { // Case-1: no buffer //chanMessa ...