标签:line inline ffffff void with miss 题解 思路 and
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2809 Accepted Submission(s): 981
#include <bits/stdc++.h> inline void read(int &x) { char ch = getchar();char c = ch;x = 0; while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar(); while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar(); if(c == ‘-‘)x = -x; } inline int lowbit(int &a){return a & (-a);} const int MAXN = 500000 + 10; int n,root,tmp1,tmp2; struct Edge{int u,v,next;}edge[MAXN << 1]; int head[MAXN], cnt, l[MAXN << 1], r[MAXN << 1], bit[MAXN << 1]; inline void insert(int a, int b){edge[++cnt] = Edge{a,b,head[a]};head[a] = cnt;} int b[MAXN], stack[MAXN], top, rank; void dfs(int root) { register int u,v,pos; stack[++top] = root; b[root] = 1; while(top) { u = stack[top--]; if(l[u]) { r[u] = ++rank; continue; } stack[++top] = u; l[u] = ++rank; for(pos = head[u];pos;pos = edge[pos].next) { v = edge[pos].v; if(b[v])continue; b[v] = true; stack[++top] = v; } } } inline void modify(int p, int k) { register int tmp = n << 1; for(;p <= tmp;p += lowbit(p)) bit[p] += k; } inline int ask(int p) { register int ans = 0; for(;p;p -= lowbit(p)) ans += bit[p]; return ans; } bool ok; int main() { while(true) { read(n);read(root); if(!(n || root))break; memset(edge, 0, sizeof(edge)); memset(head, 0, sizeof(head)); memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r)); cnt = 0; memset(bit, 0, sizeof(bit)); memset(b, 0, sizeof(b)); memset(stack, 0, sizeof(stack)); top = 0; rank = 0; register int i; for(i = 1;i < n;++ i) { read(tmp1);read(tmp2); insert(tmp1, tmp2); insert(tmp2, tmp1); } dfs(root); printf("%d", ask(r[1]) - ask(l[1] - 1)); modify(l[1], 1); for(i = 2;i <= n;i ++) { printf(" %d", ask(r[i]) - ask(l[i] - 1)); modify(l[i], 1); } printf("\n"); } return 0; }
HDU3887 Counting Offspring [2017年6月计划 树上问题03]
标签:line inline ffffff void with miss 题解 思路 and
原文地址:http://www.cnblogs.com/huibixiaoxing/p/7076089.html