【题解】

  我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的。二分+倍增找到分界点,然后更新答案即可。

  check的时候只需要判断当前节点对应的叶子结点的区间是否全部为同一种颜色,用树状数组维护所有叶子节点组成的序列的状态即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#define LL long long
#define rg register
#define N 200010
using namespace std;
int n,m,rt,cnt,ans0,ans1,l[N],r[N],t[N],col[N],dep[N],pos[N],lea[N],p[N][];
vector<int>son[N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void dfs(int x){
dep[x]=dep[p[x][]]+;
if(!son[x].size()){
if(col[x]==) ans1++;else ans0++;
pos[x]=l[x]=r[x]=++cnt; lea[cnt]=x; return;
}
int cnt0=,cnt1=;
for(rg int i=;i<(int)son[x].size();i++){
dfs(son[x][i]);
l[x]=min(l[x],l[son[x][i]]); r[x]=max(r[x],r[son[x][i]]);
if(!col[son[x][i]]) cnt0++;
else if(col[son[x][i]]==) cnt1++;
}
if(cnt0==(int)son[x].size()) col[x]=,ans0++;
else if(cnt1==(int)son[x].size()) col[x]=,ans1++;
else col[x]=;
}
inline void add(int x,int y){for(;x<=n;x+=x&-x)t[x]+=y;}
inline int query(int x){int ret=;for(;x;x-=x&-x)ret+=t[x];return ret;}
int main(){
memset(l,0x7f,sizeof(l));
memset(r,,sizeof(r));
n=read(); m=read();
for(rg int i=;i<=n;i++){
son[p[i][]=read()].push_back(i);
if(!p[i][]) rt=i;
}
for(rg int i=;i<=n;i++) col[i]=read();
dfs(rt);
// for(rg int i=1;i<=n;i++) printf("[%d %d]\n",l[i],r[i]);
for(rg int j=;j<;j++)
for(rg int i=;i<=n;i++) p[i][j]=p[p[i][j-]][j-];
for(rg int i=;i<=n;i++) add(i,col[lea[i]]);
// printf("%d %d %d\n",ans1,ans0,n-ans0-ans1);
while(m--){
int x=read(),y=x;
if(col[x]){
for(rg int i=;i>=;i--)if(p[y][i]){
int pa=p[y][i],sum=query(r[pa])-query(l[pa]-);
if(sum==r[pa]-l[pa]+) y=pa;
}
ans1-=dep[x]-dep[y]+;
// printf("y=%d\n",y);
add(pos[x],-); y=x;
for(rg int i=;i>=;i--)if(p[y][i]){
int pa=p[y][i],sum=query(r[pa])-query(l[pa]-);
if(sum==) y=pa;
}
ans0+=dep[x]-dep[y]+;
// printf("y=%d\n",y);
}
else{
for(rg int i=;i>=;i--)if(p[y][i]){
int pa=p[y][i],sum=query(r[pa])-query(l[pa]-);
if(sum==) y=pa;
}
ans0-=dep[x]-dep[y]+;
// printf("y=%d\n",y);
add(pos[x],); y=x;
for(rg int i=;i>=;i--)if(p[y][i]){
int pa=p[y][i],sum=query(r[pa])-query(l[pa]-);
if(sum==r[pa]-l[pa]+) y=pa;
}
ans1+=dep[x]-dep[y]+;
// printf("y=%d\n",y);
}
col[x]^=;
printf("%d %d %d\n",ans1,ans0,n-ans0-ans1);
}
return ;
}

noi.ac NOIP2018 全国热身赛 第二场 T3 color的更多相关文章

  1. noi.ac NOIP2018 全国热身赛 第二场 T1 ball

    [题解] 可以发现每次推的操作就是把序列中每个数变为下一个数,再打一个减一标记:而每次加球的操作就是把球的位置加上标记,再插入到合适的位置. 用set维护即可. #include<cstdio& ...

  2. NOIP2018 全国热身赛 第二场 (不开放)

    NOIP2018 全国热身赛 第二场 (不开放) 题目链接:http://noi.ac/contest/26/problem/60 一道蛮有趣的题目. 然后比赛傻逼了. 即将做出来的时候去做别的题了. ...

  3. NOI.AC NOIP2018 全国热身赛 第四场

    心路历程 预计得分:\(0 + 100 +100\) 实际得分:\(10 + 100 + 0\) 神TM T3模数为啥是\(1e9 + 9\)啊啊啊啊,而且我也确实是眼瞎...真是血的教训啊.. T2 ...

  4. noi.ac NOIP2018 全国热身赛 第四场 T1 tree

    [题解] 考虑从小到大枚举边权,按顺序加边. 当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边. 判断各个联通块内的点是否全部能跟 ...

  5. noi.ac NOIP2018 全国热身赛 第四场 T2 sort

    [题解] 跟51nod 1105差不多. 二分答案求出第L个数和第R个数,check的时候再套一个二分或者用two pointers. 最后枚举ai在b里面二分,找到所有范围内的数,排序后输出. 注意 ...

  6. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  7. NOI.AC: NOIP2018 全国模拟赛习题练习

    闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...

  8. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  9. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

随机推荐

  1. Ubuntu 18 通过ssh连接远程服务器

    ps -e | grep ssh 查看自己的Ubuntu是否开启ssh服务,如果我们要连其他的,那需要有 ssh-client的进程 如果我们的作为主机,那需要有sshd的进程 相应的安装方法: cl ...

  2. bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233 单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多... 这一题想通了 ...

  3. RHEL5.6配置本地yum源

    试验环境:RedHat Enterprise Linux 5.6(虚拟机) 一.挂载镜像 配置yum源第一步需要挂载镜像,或者直接复制操作系统的光盘文件至操作系统目录中. 挂载镜像命令如下: moun ...

  4. Hadoop 之Pig的安装的与配置之遇到的问题---待解决

    1. 前提是hadoop集群已经配置完成并且可以正常启动:以下是我的配置方案: 首先配置vim /etc/hosts 192.168.1.64 xuegod64 192.168.1.65 xuegod ...

  5. [转]WF事件驱动

    本文转自:http://www.cnblogs.com/Mayvar/archive/2011/09/03/wanghonghua_201109030446.html 已经有不少朋友知道Workflo ...

  6. outlook 通讯录分类--2017年1月16日--对联系人分类管理

    outlook功能多,复杂,导致打开界面就晕,通讯录分类 问:在Outlook 中,随着联系人数量的增多,亲朋好友.同事.客户的信息混杂在一起,每次发邮件都要用很长时间才能从联系人列表中找到需要的人. ...

  7. .net简单的fileupload控件上传

    前台代码: <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID ...

  8. 关于OPPO手机的生存和程序员的发展

    关于程序员私下讨论最多的话题,除了哪个编程最牛逼之外,哪款品牌的手机最牛逼也是我们谈论最多的话题之一吧!有的喜欢罗永浩,自然就是锤粉:有的喜欢苹果,称它为工业时代最优美的艺术品:当然,我想也有很多的人 ...

  9. [BZOJ2190][SDOI2008]仪仗队 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 看到这道题首先想到了NOI2010的能量采集,这不就是赤裸裸的弱化版吗?直接上莫比乌 ...

  10. css的过渡背景色

    css3新增的渐变背景色属性用法 原博客地址:http://caibaojian.com/css3-background-gradient.html