noi.ac NOIP2018 全国热身赛 第二场 T3 color

【题解】
我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的。二分+倍增找到分界点,然后更新答案即可。
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的更多相关文章
- noi.ac NOIP2018 全国热身赛 第二场 T1 ball
[题解] 可以发现每次推的操作就是把序列中每个数变为下一个数,再打一个减一标记:而每次加球的操作就是把球的位置加上标记,再插入到合适的位置. 用set维护即可. #include<cstdio& ...
- NOIP2018 全国热身赛 第二场 (不开放)
NOIP2018 全国热身赛 第二场 (不开放) 题目链接:http://noi.ac/contest/26/problem/60 一道蛮有趣的题目. 然后比赛傻逼了. 即将做出来的时候去做别的题了. ...
- NOI.AC NOIP2018 全国热身赛 第四场
心路历程 预计得分:\(0 + 100 +100\) 实际得分:\(10 + 100 + 0\) 神TM T3模数为啥是\(1e9 + 9\)啊啊啊啊,而且我也确实是眼瞎...真是血的教训啊.. T2 ...
- noi.ac NOIP2018 全国热身赛 第四场 T1 tree
[题解] 考虑从小到大枚举边权,按顺序加边. 当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边. 判断各个联通块内的点是否全部能跟 ...
- noi.ac NOIP2018 全国热身赛 第四场 T2 sort
[题解] 跟51nod 1105差不多. 二分答案求出第L个数和第R个数,check的时候再套一个二分或者用two pointers. 最后枚举ai在b里面二分,找到所有范围内的数,排序后输出. 注意 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC: NOIP2018 全国模拟赛习题练习
闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
随机推荐
- 使用了eclipse10年之后,我终于投向了IDEA
使用了eclipse10年之后,我终于投向了IDEA 最近,改用了idea,同事都说我投敌了.当然,这些同事都是和我一样的"老"程序员.不说毕业生,公司里的90后基本电脑都不会安装 ...
- tableView 加载更多
在ios开中中,由于屏幕尺寸限制,如果需要显示的数据很多,需要用到分页加载. 原理:先数据放到一个table中,先显示10条,table底部有一察看更多选项,点击察看更多查看解析的剩余数据.基本上就是 ...
- 解决 iphone5 4 inch 屏 app黑边问题
你需要一张640*1138的预加载图(launch image).在工程>TARGETS 中添加,系统将自动将其重命名为Default-568h@2x.png.
- c语言程序设计案例教程(第2版)笔记(六)—字符串处理实例
字符串处理 功能描述:从键盘输入一个文本行后,为用户提供菜单选择,实现字符串一些操作——显示文本行.查找并替换指定子串.删除指定子串.统计指定子串数目. 实现代码: #include<stdio ...
- JavaScript 编程艺术-第4章(JavaScript美术馆)代码
功 能:在同一个网页上切换显示不同的图片与文本(*亲测可用) 使用属性: a) document.getElementById(" ") ——返回一个与给定的id属性值的 ...
- Linux的防火墙概念
#linux的防火墙概念#因为如果你不关防火墙,很可能运行 django.nginx.mysql出错#防火墙可能会阻挡端口流量的 出口#也会阻挡外来请求的 入口 #selinux iptables f ...
- 【洛谷5398】[Ynoi2018]GOSICK(二次离线莫队)
题目: 洛谷 5398 当我刚学莫队的时候,他们告诉我莫队能解决几乎所有区间问题: 现在,当我发现一个区间问题似乎难以用我所了解的莫队解决的时候,他们就把这题的正解叫做 XXX 莫队.--题记 (以上 ...
- 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)
题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...
- java之java.lang.UnsupportedClassVersionError:com/mysql/jdbc/Driver : Unsupported major.minor version 52.0
问题解释:jdk版本和mysql驱动版本不兼容,比如:jdk1.7与mysql-connector-java-5.xxx兼容,但与mysql-connector-java-6.xxx及以上不兼容
- Android学习笔记(十一) Intent
一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.In ...