HDU 3887

View Code
  1 #include <cstdio>

  2 #include <cstdlib>

  3 #include <cstring>

  4 #include <algorithm>

  5 #include <iostream>

  6 #include <stack>

  7 #include <vector>

  8 #include <bitset>

  9 

 10 using namespace std;

 11 

 12 #define print(x) cout<<x<<endl

 13 #define input(x) cin>>x

 14 #define SIZE 100010

 15 #define pb push_back

 16 

 17 inline int lowbit(int x){return x&(-x);}

 18 int n,root;

 19 vector<int> g[SIZE];

 20 int l[SIZE],r[SIZE];

 21 //the first visit and the last visit of one node

 22 int baum[SIZE<<1];

 23 int cnt,ans[SIZE];

 24 

 25 int sum(int x)

 26 {

 27     int res=0;

 28     for(int i=x;i>0;i-=lowbit(i))

 29     {

 30         res+=baum[i];

 31     }

 32     return res;

 33 }

 34 

 35 void modify(int x,int val)

 36 {

 37     for(int i=x;i<cnt;i+=lowbit(i))

 38     {

 39         baum[i]+=val;

 40     }

 41 }

 42 

 43 void init()

 44 {

 45     for(int i=0;i<SIZE;i++) g[i].clear();

 46     memset(l,0,sizeof(l));

 47     memset(r,0,sizeof(r));

 48     memset(baum,0,sizeof(baum));

 49     memset(ans,0,sizeof(ans));

 50     cnt=1;

 51 }

 52 

 53 void dfs()

 54 {

 55     stack<int> st;

 56     st.push(root);

 57     bitset<SIZE> visit;

 58     while(!st.empty())

 59     {

 60         int now=st.top();

 61         if(!visit[now])

 62         {

 63             l[now]=cnt++;

 64             visit[now]=true;

 65         }

 66         bool pushed=false;

 67         for(int i=0;i<(int)g[now].size();i++)

 68         {

 69             if(!visit[g[now][i]])

 70             {

 71                 st.push(g[now][i]);

 72                 pushed=true;

 73                 break;

 74             }

 75         }

 76         if(pushed) continue;

 77         

 78         if(visit[now])

 79         {

 80             r[now]=cnt++;

 81             st.pop();

 82         }

 83     }

 84 }

 85 

 86 void slove()

 87 {

 88     for(int i=1;i<=n;i++)

 89     {

 90         ans[i]=sum(r[i])-sum(l[i]-1);

 91         modify(l[i],1);

 92     }

 93 }

 94 

 95 int main()

 96 {

 97     int a,b;

 98     while(input(n>>root) && n+root)

 99     {

100         init();

101         for(int i=0;i<n-1;i++)

102         {

103             scanf("%d%d",&a,&b);

104             g[a].pb(b);

105             g[b].pb(a);

106         }

107         dfs();

108         slove();

109         for(int i=1;i<=n;i++)

110         {

111             if(i>1) printf(" ");

112             printf("%d",ans[i]);

113         }

114         puts("");

115     }

116     return 0;

117 }

你可能感兴趣的:(HDU)