传送门

Description

你有一个 \(n\)个点的树,第 \(i\)个点的父亲是\(p_i\)。每个点有一个权值 \(t_i\) 和一个颜色黑或者白。所有点一开始都是白色。

你要进行 \(m\)次操作,每次给一个点换颜色(从白变成黑,从黑变成白),在每次操作结束时,问有多少个白点 \(i\) 的子树内黑点的个数大于 \(t_i\)。

Solution 

相当于每次修改一条链的\(t_i\),让它们\(+1/-1\)

树链剖分后分块处理

复杂度\(O(n\sqrt n \log n)\)

Code 

/*树剖+分块*/
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
#define db double
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=1e5+5,A=1e5;
int fa[MN],n,m;
vector<int> G[MN];
int siz[MN],mx[MN];
void dfs1(int x)
{
reg int i;siz[x]=1;
for(i=G[x].size()-1;~i;--i)
dfs1(G[x][i]),siz[x]+=siz[G[x][i]],siz[G[x][i]]>siz[mx[x]]?mx[x]=G[x][i]:0;
}
int dind,id[MN],dfn[MN],top[MN];
void dfs2(int x,int tp)
{
id[dfn[x]=++dind]=x;top[x]=tp;if(mx[x])dfs2(mx[x],tp);reg int i;
for(i=G[x].size()-1;~i;--i)if(G[x][i]^mx[x])dfs2(G[x][i],G[x][i]);
}
int BL,cnt[500][MN<<1],t[MN],tag[500],T,bel[MN],ans;
bool col[MN];
void init()
{
reg int i,l,r;
for(i=1;i<=n;++i) t[dfn[i]]=read();
BL=(int)ceil((db)sqrt(n));
for(T=1,l=1,r=BL;l<=n;++T,l=r+1,r=min(r+BL,n))
for(i=l;i<=r;++i)bel[i]=T,++cnt[T][t[i]+A];
}
void swi(int x)
{
if(col[x]){++cnt[bel[x]][t[x]+A];if(t[x]<tag[bel[x]])++ans;}
else{--cnt[bel[x]][t[x]+A];if(t[x]<tag[bel[x]])--ans;}col[x]^=1;
}
void rough(int L,int R,int v)
{
int x=bel[L],l=BL*x-BL+1,r=min(n,BL*x),i;
for(i=l;i<=r;++i)if(!col[i])--cnt[x][t[i]+A],ans-=(t[i]<tag[x]);
for(i=l;i<=r;++i)t[i]-=tag[x];tag[x]=0;
for(i=L;i<=R;++i)t[i]-=v;
for(i=l;i<=r;++i)if(!col[i])++cnt[x][t[i]+A],ans+=(t[i]<tag[x]);
}
void sol(int L,int R,int v)
{
int xl=bel[L],xr=bel[R];
if(xl==xr)rough(L,R,v);
else
{
rough(L,xl*BL,v);rough(xr*BL-BL+1,R,v);
for(++xl;xl<xr;++xl)ans+=v*cnt[xl][tag[xl]-(v<0)+A],tag[xl]+=v;
}
}
void Upd(int x,int v){swi(dfn[x]);while(x)sol(dfn[top[x]],dfn[x],v),x=fa[top[x]];printf("%d ",ans);}
int main()
{
#ifndef LOCAL
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
#endif
n=read(),m=read();reg int i,q;
for(i=2;i<=n;++i)G[fa[i]=read()].push_back(i);
dfs1(1);dfs2(1,1);init();
while(m--) q=read(),Upd(abs(q),q/abs(q));
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「2019-8-13提高模拟赛」树 (tree)的更多相关文章

  1. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  2. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  3. 「2019-8-11提高模拟赛」女装盛宴 (flag)

    传送门 Solution  基环树+倍增+双指针 第一次因为#define int long long而玄学RE 为什么标程都不用开\(long long\)啊 Code  /*玄学RE 看来defi ...

  4. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  5. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  6. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  7. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  8. 「NOIP模拟赛」数位和乘积(dp,高精)

    统计方案数,要么组合数,要么递推(dp)了. 这是有模拟赛历史以来爆炸最狠的一次 T1写了正解,也想到开long long,但是开错了地方然后数组开大了结果100->0 T3看错题本来简单模拟又 ...

  9. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

随机推荐

  1. Charles配置https

    1. 安装Charles ,破解将Charles.jar 覆盖安装路径的\lib 中的文件 2. 查看本机IP 3. 设置手机代理 4. 设置: 5. 手机安装证书 手机浏览器输入网址:chls.pr ...

  2. win10系统驱动备份及还原

    win10系统驱动备份及还原 方法如下: 1.右键单击开始按钮,选择“命令提示符(管理员)” 2.输入如下命令后按回车,等待备份完成: dism /online /export-driver /des ...

  3. win10下jupyter修改默认路径的办法

    查了很多资料,发现都不管用,最后亲测找到一种方法. 实现的方法就是修改快捷方式标签的目标栏,如下图: 后面有一个%USERPROFILE% 将%USERPROFILE%改成你要的路径就可以了 然后应用 ...

  4. 常用模块 - configparse模块

    一.简介 configparser模块在Python中是用来读取配置文件的,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节点(section),每个节可以有多个参数(键=值 ...

  5. Windows10简单启动项目添加方法

    1,cmd输入 shell:startup 打卡启动项文件夹 2,将需要启动执行的项目的快捷方式放入此文件夹 3,重新启动系统就可以知道效果了

  6. IVS_技术

    视频监控技术按照设备发展过程分为三个阶段:模拟视频监控.数字视频监控.智能视频监控,如下图: 模拟视频监控 第一代视频监控系统也叫做闭路电视监控系统,简称CCTV(Close Circuit Tele ...

  7. C#对MongDB取数据的常用代码

    1.使用聚合取最新的实时数据(每一个测站有多条数据,取日期最新的数据.也就是每个测站取最新的值) var group = new BsonDocument { {"_id",new ...

  8. java继承 、方法重写、重写toString方法

    1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...

  9. docker 常见问题处理汇总

    问题一: docker执行docker info出现如下警告WARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip ...

  10. 日常bug(1)

    今天在写写代码的时候,前端找我,说我写的一个接口有可能有问题.导致前端的数据不能正常显示,我去看了一下,确实不能正常显示.问题的原因是本来前端循环遍历一个json里的数组,但是接下来的数据变成对象了. ...