CF1017G The Tree
/*
这是什么神仙题目QAQ
首先考虑在序列上的问题
先不考虑修改成白色, 一个白点能r被染成黑色 意味着能够找到一个l使得在l-r中的操作1次数大于等于
r - l + 1
我们把初始值覆盖成-1就相当于单点+1求最大后缀和了
然后覆盖成白色, 相当于在这个点减去一些值使得最后到达他的最大后缀是-1, 然后对子树进行覆盖
上树同理 树剖即可
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define pii pair<int, int>
#include<cmath>
#define ll long long
#define M 100010
#define mmp make_pair
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int fa[M], sz[M], son[M], dfn[M], dft, top[M], deep[M], n, q;
vector<int> to[M];
#define ls now << 1
#define rs now << 1 | 1
#define lson l, mid, now << 1
#define rson mid + 1, r, now << 1 | 1
void dfs(int now, int f) {
deep[now] = deep[f] + 1;
sz[now] = 1;
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
dfs(vj, now);
if(sz[son[now]] < sz[vj]) son[now] = vj;
sz[now] += sz[vj];
}
}
void dfs(int now) {
dfn[now] = ++dft;
if(son[now]) {
top[son[now]] = top[now];
dfs(son[now]);
}
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
if(vj == son[now]) continue;
top[vj] = vj;
dfs(vj);
}
}
int len[M << 2], mx[M << 2], s[M << 2], laz[M << 2];
void pushup(int now) {
mx[now] = max(mx[rs], mx[ls] + s[rs]);
s[now] = s[ls] + s[rs];
}
void add(int now) {
laz[now] = 1;
mx[now] = -1, s[now] = -len[now];
}
void pushdown(int now) {
if(!laz[now]) return;
add(ls);
add(rs);
laz[now] = 0;
}
void build(int l, int r, int now) {
len[now] = r - l + 1;
if(l == r) {
mx[now] = s[now] = -1;
return;
}
int mid = (l + r) >> 1;
build(lson), build(rson);
pushup(now);
}
void modify(int l, int r, int now, int pl, int v) {
if(l > pl || r < pl) return;
if(l == r) {
mx[now] += v, s[now] += v;
return;
}
pushdown(now);
int mid = (l + r) >> 1;
modify(lson, pl, v), modify(rson, pl, v);
pushup(now);
}
void cover(int l, int r, int now, int ln, int rn) {
if(l > rn || r < ln) return;
if(l >= ln && r <= rn) {
add(now);
return;
}
pushdown(now);
int mid = (l + r) >> 1;
cover(lson, ln, rn), cover(rson, ln, rn);
pushup(now);
}
pair<int,int> biao, tmp;
pii operator + (pii a, pii b) {
return mmp(max(b.first, a.first + b.second), a.second + b.second);
}
pii que(int l, int r, int now, int ln, int rn) {
if(l >= ln && r <= rn) return mmp(mx[now], s[now]);
int mid = (l + r) >> 1;
pushdown(now);
if(rn <= mid) return que(lson, ln, rn);
if(ln > mid) return que(rson, ln, rn);
return que(lson, ln, rn) + que(rson, ln, rn);
}
int query(int x) {
tmp = biao;
for(; x; x = fa[top[x]]) {
tmp = que(1, n, 1, dfn[top[x]], dfn[x]) + tmp;
}
return tmp.first;
}
int main() {
biao = mmp(-0x3e3e3e3e, 0);
n = read(), q = read();
for(int i = 2; i <= n; i++) fa[i] = read(), to[fa[i]].push_back(i);
dfs(1, 1);
top[1] = 1;
dfs(1);
build(1, n, 1);
while(q--) {
int op = read(), x = read();
if(op == 1) {
modify(1, n, 1, dfn[x], 1);
}
if(op == 2) {
int t = query(x);
modify(1, n, 1, dfn[x], -(t + 1));
if(sz[x] > 1) cover(1, n, 1, dfn[x] + 1, dfn[x] + sz[x] - 1);
}
if(op == 3) {
puts(query(x) >= 0 ? "black" : "white");
}
}
return 0;
}
CF1017G The Tree的更多相关文章
- CF1017G The Tree 树链剖分
CF1017G The Tree LG传送门 树链剖分好题. 乍一看还以为是道沙比题,然后发现修改操作有点不一样. 但是如果你对基本操作还不太熟练,可以看看我的树链剖分总结 有三个操作: 从一个点往下 ...
- CF1017G——The Tree
传送门:QAQQAQ 题意:给你一棵树,有三种操作,设所有点本来未感染 1:感染节点i,若i被二次感染,则感染i的儿子(若儿子也被感染,则感染孙子,直到到底或者感染了健康点) 2:使i子树全部健康 3 ...
- [CF1017G]The Tree[树链剖分+线段树]
题意 给一棵一开始 \(n\) 个点全是白色的树,以 \(1\) 为根,支持三种操作: 1.将某一个点变黑,如果已经是黑色则该操作对所有儿子生效. 2.将一棵子树改成白色. 3.询问某个点的颜色. \ ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
随机推荐
- WIN10 网速问题,边下载 边逛论坛 电脑 有点卡
引用:https://www.chiphell.com/forum.php?mod=viewthread&tid=1961836&extra=page%3D1&mobile=2 ...
- Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)
原文链接 http://www.jb51.net/article/39221.htm 这篇文章大家都在转载,估计写的有条理吧,本人稍微做一下补充 1.对查询进行优化,应尽量避免全表扫描,首先应考虑 ...
- leedcode_贪心算法系列
861. 翻转矩阵后的得分 思路: 行首的权值最大,故首先将其置1; 每列由于权值相同,故只需要将0多于1的情况反转即可 763. 划分字母区间 思路: 1.计算每个字母的最右边界下标,并记录到新数组 ...
- VB编程插件AmicForVB插件
VB编程插件AmicForVB插件下载地址http://www.vbgood.com/thread-32788-1-1.htmlhttp://www.vbgood.com/forum.php?mod= ...
- Java 线程转储 [转]
http://www.oschina.net/translate/java-thread-dump java线程转储 java的线程转储可以被定义为JVM中在某一个给定的时刻运行的所有线程的快照.一个 ...
- IDC:网管网
ylbtech-IDC:网管网 1.返回顶部 1. 中文名:网管网.网络管理信息 属 于:电信支撑网 通 过:工作站 网管网: 是接收.处理和传送网络管理信息的电信支撑网,它通过工作站.标 ...
- 【ZZ】号称“开发者神器”的GitHub,到底该怎么用?
号称“开发者神器”的GitHub,到底该怎么用? https://mp.weixin.qq.com/s/zpKOBMKWckY05Mv_B28RgQ A developer’s introductio ...
- OpenStack单节点网络设置
一.上传镜像文件 1.上传镜像 2.检索镜像 二.创建网络 1.创建内部网络 2.创建外部网络 3.创建内部网络子网 设置DHCP分配地址池,点击已创建 4.创建外部网络子网 注意:外部网络与仅主机( ...
- [UE4]RPC,远程调用
RPC 一.Remote Procedure Call:远程程序调用 二.一个进程调用另外一个进程上的函数 由于“Server-shoot”方法被标记为“在服务器上运行”,所以尽管是在第二个窗口(客户 ...
- [UE4]非常实用的SizeBox控件
Desired:表示以期望的实际尺寸显示视图. SizeBox最好作为Child Widget的根节点.(如果SizeBox的父节点是Canvas Panel,SizeBox会变成可拉伸,ChildL ...