传送门

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. el-select和el-cascader的visible-change下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)

    原文:https://blog.csdn.net/CarryBest/article/details/79959389 今天做项目时,用elementUI框架,需要下拉框隐藏时出发某个函数,用了vis ...

  2. 通过创建一个简单的骰子游戏来探究 Python

    在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏.这次,我将展示如何使用 Python 模块 Pygame 来创建一个图形化游戏.它将需要几篇文章才 ...

  3. SQL Injection (Blind)

    Low级别基于布尔的盲注思路 1.判断是否存在注入,注入是字符型还是数字型 2.猜解当前数据库名 3.猜解数据库中的表名 4.猜解表中的字段名 5.猜解数据 判断是否有sql注入 输入1.1’ and ...

  4. 解决for循环中异步处理(异步变同步)

    前沿:参考ES6语法的async/await的处理机制 先上一段代码 function getMoney(){ var money=[100,200,300] for( let i=0; i<m ...

  5. django 自定义身份认证

    自定义身份认证: Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替换的.这个文档 ...

  6. 2.live555源码分析----服务端doEventLoop()函数分析

    上一篇博客说道,live555服务端main函数做的最后一件事就是调用如下代码陷入死循环: env->taskScheduler().doEventLoop(); // does not ret ...

  7. 详解Linux系统中10个最危险的命令

    概述 大多数的朋友都是主要用的windows系统,基本用鼠标就可以完成所有的操作,但是在Linux系统中很多都是键盘+命令操作电脑的,Linux命令行使用很有趣,但有时候也很危险,尤其是在你不确定你自 ...

  8. SHELL脚本编程-expect

    SHELL脚本编程-expect 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.expect概述 1>.expect介绍 expect 是由Don Libes基于Tcl( ...

  9. Jenkins+robotframework单机版简约教程

    迫于某人极渴望学自动化测试,因此写下此简约教程.妈蛋我是个JAVA后端开发啊... 此教程为基于window系统的Jenkins单机版,测试代码无版本控制的精要压缩版本教程,勿喷 前提:通过Jenki ...

  10. Mysql【第一课】