[BZOJ4771]七彩树
来源:互联网 发布:淘宝网退换货流程 编辑:程序博客网 时间:2024/06/11 21:12
题目链接:BZOJ4771
题目大意
有一棵染色的树,每个点有一个颜色,若干个询问,
分析
1. 建两棵主席树,
2.
3.
4. 自底向上合并
5. 询问时直接在
上代码
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 1e5 + 10;const int M = 1e7 + 10;int n, m;inline int read() { char ch; int ans = 0, neg = 1; while (!isdigit(ch = getchar())) if (ch == '-') neg = -1; while (isdigit(ch)) ans = ans * 10 + ch - '0', ch = getchar(); return ans * neg;}int fa[N], clr[N], dep[N];int T1[N], T2[N], cnt;int lc[M], rc[M], tot[M];int modify(int a, int l, int r, int p, int c) { int now = ++cnt; tot[now] = tot[a] + c; if (l == r) return now; int mid = (l + r) >> 1; if (p <= mid) lc[now] = modify(lc[a], l, mid, p, c), rc[now] = rc[a]; else rc[now] = modify(rc[a], mid + 1, r, p, c), lc[now] = lc[a]; return now;}int merge1(int a, int b, int l, int r) { if (!a) return b; if (!b) return a; int now = ++cnt; tot[now] = tot[a] + tot[b]; if (l == r) return now; int mid = (l + r) >> 1; lc[now] = merge1(lc[a], lc[b], l, mid); rc[now] = merge1(rc[a], rc[b], mid + 1, r); return now;}int merge2(int a, int b, int l, int r, int p) { if (!a) return b; if (!b) return a; int now = ++cnt; if (l == r) { if (tot[a] > tot[b]) swap(a, b); tot[now] = tot[a], T1[p] = modify(T1[p], 1, n, tot[b], -1); return now; } int mid = (l + r) >> 1; lc[now] = merge2(lc[a], lc[b], l, mid, p); rc[now] = merge2(rc[a], rc[b], mid + 1, r, p); return now;}int query(int a, int l, int r, int ll, int rr) { if (l == ll && r == rr) return tot[a]; int mid = (l + r) >> 1; if (rr <= mid) return query(lc[a], l, mid, ll, rr); else if (ll > mid) return query(rc[a], mid + 1, r, ll, rr); return query(lc[a], l, mid, ll, mid) + query(rc[a], mid + 1, r, mid + 1, rr);}void init() { n = read(), m = read(), cnt = 0; for (int i = 1; i <= n; i++) clr[i] = read(); for (int i = 2; i <= n; i++) fa[i] = read(); for (int i = 1; i <= n; i++) dep[i] = dep[fa[i]] + 1; for (int i = 1; i <= n; i++) { T1[i] = modify(0, 1, n, dep[i], 1); T2[i] = modify(0, 1, n, clr[i], dep[i]); } for (int i = n; i > 1; i--) { T1[fa[i]] = merge1(T1[fa[i]], T1[i], 1, n); T2[fa[i]] = merge2(T2[fa[i]], T2[i], 1, n, fa[i]); }}void figure() { int ans = 0; for (int i = 1; i <= m; i++) { int a = read() ^ ans, b = read() ^ ans; ans = query(T1[a], 1, n, dep[a], min(n, dep[a] + b)); printf("%d\n", ans); }}int main() { int T = read(); while (T--) { init(); figure(); } return 0;}
以上
0 0
- BZOJ4771 七彩树
- [BZOJ4771]七彩树
- bzoj4771 七彩树
- BZOJ4771——七彩树
- [BZOJ Contest-2017省队十连测推广赛2·T2][BZOJ4771][主席树][dfs序]七彩树
- [BZOJ4771][七彩树][可持久化线段树在线转离线+LCA+Set]
- BZOJ4771:七彩树 (LCA+Treap+可持久化线段树)
- BZOJ 4771 七彩树
- BZOJ 4771 七彩树
- 【bzoj 4771】 七彩树
- bzoj4771 -- dfs序+倍增+主席树
- [主席树] BZOJ 4771 七彩树
- 七彩变换园环
- 鱼(七彩)
- 七彩的阳光
- 七彩舞动精灵
- 七彩复选框
- Android 屏幕七彩闪动
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- linux下的mysql启动、停止、重启,状态 命令操作
- unity之碰撞检测
- 【ZJOI2017】仙人掌 题解
- ubuntu安装MySQL并导入数据
- [BZOJ4771]七彩树
- bug列表(一):Iframe框架下如何控制滚动条。
- datetime 和 timestamp
- 获取客户端IP
- 带状线、微带线及传输延时
- Pivot和UnPivot 用法
- [LeetCode]303. Range Sum Query
- Android Studio导入项目太慢解决方法
- 【知识之心】深度学习精华汇总