Poj--3321(DFS序)
2014-10-03 00:44:18
思路:DFS序列处女题,接触了下把树形结构转化为线性结构的思想,时间戳是个好思想。恩恩,就这样,题目挺裸的,再加个树状数组就水过了。
1 /************************************************************************* 2 > File Name: 3321.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Thu 02 Oct 2014 10:54:46 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <queue> 14 #include <iostream> 15 #include <algorithm> 16 using namespace std; 17 #define lp (p << 1) 18 #define rp (p << 1|1) 19 #define getmid(l,r) (l + (r - l) / 2) 20 typedef long long ll; 21 const int INF = 1 << 30; 22 const int maxn = 100010; 23 24 int N,M; 25 int first[maxn],next[maxn],ver[maxn],ecnt; 26 int tot,tin[maxn],tout[maxn],sta[maxn],c[maxn]; 27 28 int Lowbit(int x){return x & (-x);} 29 void Update(int x,int d){while(x <= N){c[x] += d;x += Lowbit(x);}} 30 int Getsum(int x){int res = 0;while(x){res += c[x];x -= Lowbit(x);}return res;} 31 32 void Add(int u,int v){ 33 next[++ecnt] = first[u]; 34 first[u] = ecnt; 35 ver[ecnt] = v; 36 } 37 38 void Dfs(int p){ 39 tin[p] = ++tot; 40 for(int i = first[p]; i; i = next[i]) 41 Dfs(ver[i]); 42 tout[p] = tot; 43 } 44 45 int main(){ 46 int u,v,q; 47 char s[5]; 48 scanf("%d",&N); 49 for(int i = 1; i <= N - 1; ++i){ 50 scanf("%d%d",&u,&v); 51 Add(u,v); 52 } 53 Dfs(1); 54 for(int i = 1; i <= N; ++i){ 55 sta[i] = 1; 56 Update(tin[i],1); 57 } 58 scanf("%d",&M); 59 for(int i = 1; i <= M; ++i){ 60 scanf("%s%d",s,&q); 61 if(s[0] == 'C'){ 62 if(sta[q]) Update(tin[q],-1); 63 else Update(tin[q],1); 64 sta[q] = 1 - sta[q]; 65 } 66 else{ 67 printf("%d\n",Getsum(tout[q]) - Getsum(tin[q] - 1)); 68 } 69 } 70 return 0; 71 }

浙公网安备 33010602011771号