题目大意:给你一棵n个点的树,每个点有颜色,m次询问,每次询问一个点x的子树内深度不超过depth[x]+d的节点的颜色数量,强制在线。(n,m<=100000,多组数据,保证n,m总和不超过500000)

思路:若不考虑深度限制,我们可以先给每个点赋点权1,再把每种颜色的节点按dfs序排序后相邻的节点的LCA的点权减1,每次求子树和即可回答询问,若有限制深度,我们可以按深度顺序把点一个个加入树中,每种颜色用个set维护,强制在线只要把求子树和的线段树可持久化就可以了,总复杂度O(nlogn)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 100000
#define K 17
#define ND 8000000
struct edge{int nx,t;}e[MN+];
int h[MN+],en,c[MN+],d[MN+],l[MN+],r[MN+],cnt,fa[K][MN+],p[MN+],rt[MN+],tn;
class stcmp{public:inline bool operator()(int a,int b){return l[a]<l[b];}};
set<int,stcmp> st[MN+];
set<int,stcmp>::iterator x,y,z;
struct node{int l,r,s;}t[ND+];
int renew(int x,int l,int r,int k,int z)
{
int p=++tn,mid=l+r>>;
if(l==r)return t[p]=(node){,,t[x].s+z},p;
if(k<=mid)return t[p]=(node){renew(t[x].l,l,mid,k,z),t[x].r,t[x].s+z},p;
return t[p]=(node){t[x].l,renew(t[x].r,mid+,r,k,z),t[x].s+z},p;
}
int query(int x,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[x].s;
int mid=l+r>>;
if(R<=mid)return query(t[x].l,l,mid,L,R);
if(L>mid)return query(t[x].r,mid+,r,L,R);
return query(t[x].l,l,mid,L,mid)+query(t[x].r,mid+,r,mid+,R);
}
inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void dfs(int x)
{
l[x]=++cnt;
for(int i=h[x];i;i=e[i].nx)d[e[i].t]=d[x]+,dfs(e[i].t);
r[x]=cnt;
}
bool cmp(int a,int b){return d[a]<d[b];}
int lca(int x,int y)
{
int dx=d[x]-d[y],i;
if(dx<)dx=-dx,swap(x,y);
for(i=;dx;dx>>=,++i)if(dx&)x=fa[i][x];
if(x==y)return x;
for(i=K;i--;)if(fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int main()
{
int T,n,m,i,j,t;
for(T=read();T--;)
{
n=read();m=read();
for(i=;i<=n;++i)c[i]=read(),p[i]=i,st[i].clear();
memset(h,t=tn=en=cnt=,sizeof(int)*(n+));
for(i=;i<=n;++i)ins(fa[][i]=read(),i);
for(i=;i<K;++i)for(j=;j<=n;++j)fa[i][j]=fa[i-][fa[i-][j]];
dfs();sort(p+,p+n+,cmp);
for(i=;i<=n;++i)
{
t=renew(t,,n,l[p[i]],);
st[c[p[i]]].insert(p[i]);
x=y=z=st[c[p[i]]].find(p[i]);--x;++z;
if(y!=st[c[p[i]]].begin()&&z!=st[c[p[i]]].end())t=renew(t,,n,l[lca(*x,*z)],);
if(y!=st[c[p[i]]].begin())t=renew(t,,n,l[lca(*x,*y)],-);
if(z!=st[c[p[i]]].end())t=renew(t,,n,l[lca(*y,*z)],-);
rt[d[p[i]]]=t;
}
for(t=;m--;)
{
i=read()^t;j=read()^t;
printf("%d\n",t=query(rt[d[i]+j>d[p[n]]?d[p[n]]:d[i]+j],,n,l[i],r[i]));
}
}
}

[BZOJ]2017省队十连测推广赛1 T2.七彩树的更多相关文章

  1. [BZOJ]2017省队十连测推广赛1

    听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点 ...

  2. [bzoj省选十连测推广赛2]T2七彩树

    抄自:http://blog.csdn.net/coldef/article/details/61412577 当时看了就不会,看了别人的题解不懂怎么维护,最后抄了个代码....... 给定一棵n个点 ...

  3. bzoj省选十连测推广赛

    A.普通计算姬 题意:给丁一棵树,每个点有一个权值,用sum(x)表示以x为根的子树的权值和,要求支持两种操作: 1 u v  :修改点u的权值为v. 2 l  r   :  求∑sum[i] l&l ...

  4. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 93  Solved: 53[Submit][Status][ ...

  5. bzoj 5216: [Lydsy2017省队十连测]公路建设

    5216: [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 66  Solved: 37[Submit][St ...

  6. Lydsy2017省队十连测

    5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...

  7. bzoj 5218: [Lydsy2017省队十连测]友好城市

    题意: 这题显然直接tarjan是做不了的. 这里安利另一个求SCC的算法Kosaraju,学习的话可以见这篇博客 于是结合莫队,我们有了个暴力. 发现主要瓶颈是dfs过程中找最小的未经过的点,我们用 ...

  8. 【BZOJ 5222】[Lydsy2017省队十连测]怪题

    题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...

  9. bzoj 5217: [Lydsy2017省队十连测]航海舰队

    Description Byteasar 组建了一支舰队!他们现在正在海洋上航行着.海洋可以抽象成一张n×m 的网格图,其中有些位置是" .",表示这一格是海水,可以通过:有些位置 ...

随机推荐

  1. 冲刺每日报告--Day1

    敏捷冲刺每日报告--Day1 情况简介 由于李世钰同学出差了,周六才能回来.所以我们只能先写爬虫,封装代码提供接口等他回来调用. 任务进度 赵坤:编写了基本爬虫代码,目前能在国内有版权的B站.爱奇艺中 ...

  2. vim配置强悍来袭

    vim   这个关键字,我不想再过多的解释,相信看到这里的同仁,对vim都有十七八分的理解,如果你还不知道vim是什么,自己找个黑屋子... 废话不多说,今天在这里主要说vim的,不带插件的配置,也就 ...

  3. linux下安装redis和phpredis扩展

    一.安装redis 1.下载redis-3.2.3.tar.gz wget http://download.redis.io/releases/redis-3.2.3.tar.gz 2.解压redis ...

  4. threadlocal原理及常用应用场景

    1.深入解析ThreadLocal类 ThreadLocal类提供的几个方法: public T get() { } public void set(T value) { } public void  ...

  5. javascript实现浏览器窗口大小被改变时触发事件的方法

    转载 当浏览器的窗口大小被改变时触发的事件window.onresize 为事件指定代码: 复制代码代码如下: window.onresize = function(){ } 例如: 浏览器可见区域信 ...

  6. 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令

    最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...

  7. 新概念英语(1-97)A Small Blue Case

    Lesson 97 A small blue case 一只蓝色的小箱子 Listen to the tape then answer this question. Does Mr. Hall get ...

  8. SpringCloud用户自定义配置信息的定义和查看

    一.概念 在SpringCloud项目中,用户自己定义的配置信息也可以放在application.*,需要以 info打头,以便使用公用基础设施 /info 查看! 本文讲解基于 ConfigServ ...

  9. 从微软MVP到女儿开学--2017前半年小结

    2017年转眼就到了9月,原本在年初定的计划基本泡汤了. 看书啊减肥啊出教程啊,都被因为各种事物给缠身而没有完成. 1号带女儿去报名的时候,听到老师说"家长们请到这边来集合"的时候 ...

  10. .net 4种单例模式

    转载: https://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html using System; using System.Collec ...