博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1017G The Tree
阅读量:4614 次
发布时间:2019-06-09

本文共 3120 字,大约阅读时间需要 10 分钟。

/*这是什么神仙题目QAQ首先考虑在序列上的问题先不考虑修改成白色, 一个白点能r被染成黑色 意味着能够找到一个l使得在l-r中的操作1次数大于等于r - l + 1我们把初始值覆盖成-1就相当于单点+1求最大后缀和了然后覆盖成白色, 相当于在这个点减去一些值使得最后到达他的最大后缀是-1, 然后对子树进行覆盖上树同理 树剖即可 */#include
#include
#include
#include
#include
#define pii pair
#include
#define ll long long#define M 100010#define mmp make_pairusing 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
to[M];#define ls now << 1#define rs now << 1 | 1#define lson l, mid, now << 1#define rson mid + 1, r, now << 1 | 1void 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
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;}

转载于:https://www.cnblogs.com/luoyibujue/p/10519489.html

你可能感兴趣的文章
Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)
查看>>
@ResponseBody 注解是什么意思?
查看>>
Code4App地址
查看>>
蓄水池抽样
查看>>
C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例
查看>>
Sublime Text 插件推荐——for web developers
查看>>
Grails中service的线程安全的小例子
查看>>
MySQL与Oracle(二)---日期对比(MySQL)
查看>>
懵懂的第一周
查看>>
OpenFileDialog对话框Filter属性
查看>>
树链剖分
查看>>
poj2886线段树(单点修改,区间查询)
查看>>
通过JazzyViewPager来实现Fragment页面间的动画切效果
查看>>
golang map和for循环的查找效率对比
查看>>
struts2中服务器端数据校验
查看>>
form表单里的坑
查看>>
Vs2010+opencv2.3.1 imread出现异常
查看>>
Restful --- 让JSON回归单纯
查看>>
★如何解释特修斯之船问题?
查看>>
循环移位
查看>>