题目大意:给定一个上下级关系树,一开始都是没有做事的,然后给定x,y,就是指定x及其下属此时全部做事件y。最后就是查询x此时在做那件事情。
思路:把子树上的点连续的hash到线段树上去,用线段树更新,hash的时候采用dfs后序遍历。
/***************************************** Author :Crazy_AC(JamesQi) Time :2016 File Name : *****************************************/ // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <climits> using namespace std; #define MEM(x,y) memset(x, y,sizeof x) #define pk push_back #define lson rt << 1 #define rson rt << 1 | 1 #define bug cout << "BUG HERE\n" typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; typedef pair<ii,int> iii; const double eps = 1e-8; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int nCase = 0; const int maxn = 50010; const int maxm = 50010 << 2; struct Edge { int to, nxt; Edge() {} Edge(int to,int nxt) : to(to), nxt(nxt) {} }edges[maxn<<1]; int head[maxn], ecnt; int lef[maxn], rig[maxn], id[maxn]; int vis[maxn]; int n, cnt; int dfs(int u,int fa) { int first = 1; int l; for (int i = head[u];~i; i = edges[i].nxt) { int v = edges[i].to; if (v == fa) continue; if (first) l = dfs(v, u); else dfs(v, u); first = 0; } id[u] = ++cnt; if (first) lef[u] = cnt;//leaf else lef[u] = l;//internal rig[u] = cnt; return lef[u]; } struct Seg { int l, r; int flag; int val; }p[maxm]; void build(int rt,int L,int R) { p[rt].l = L, p[rt].r = R, p[rt].flag = 0, p[rt].val = -1; if (L == R) return ; int mid = (L + R) >> 1; build(lson, L, mid); build(rson, mid + 1, R); } void down(int rt) { if (p[rt].flag) { p[lson].flag = p[rson].flag = p[rt].flag; p[lson].val = p[rson].val = p[rt].val; p[rt].flag = 0; } } int Query(int rt,int pos) { if (p[rt].l == p[rt].r && p[rt].l == pos) return p[rt].val; down(rt); int mid = (p[rt].l + p[rt].r) >> 1; if (pos <= mid) return Query(lson, pos); return Query(rson, pos); } void Modify(int rt,int L,int R,int val) { if (L <= p[rt].l && p[rt].r <= R) { p[rt].flag = val; p[rt].val = val; return ; } down(rt); int mid = (p[rt].l + p[rt].r) >> 1; if (L <= mid) Modify(lson, L, R, val); if (R > mid) Modify(rson, L, R, val); } int main(int argc, const char * argv[]) { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int t; cin >> t; while(t--) { cnt = 0; memset(head, -1,sizeof head), ecnt = 0; memset(vis, 0,sizeof vis); scanf("%d",&n); int u, v; for (int i = 1;i < n;++i) { scanf("%d%d",&u,&v); vis[u] = 1; edges[ecnt] = Edge(v, head[u]), head[u] = ecnt++; edges[ecnt] = Edge(u, head[v]), head[v] = ecnt++; } for (int i = 1;i <= n;++i) { if (!vis[i]) { dfs(i, -1); break; } } build(1, 1, n); printf("Case #%d:\n", ++nCase); int q; scanf("%d",&q); char op[10]; int x, y; while(q--) { scanf("%s", op); if (op[0] == 'C') { scanf("%d", &x); printf("%d\n", Query(1, id[x])); }else { scanf("%d%d",&x,&y); Modify(1, lef[x], rig[x], y); } } } return 0; }