设为首页 加入收藏

TOP

HDU 3887 Counting Offspring(DFS序求子树权值和)
2015-11-21 00:58:58 来源: 作者: 【 】 浏览:2
Tags:HDU 3887 Counting Offspring DFS
Problem Description You are given a tree, it’s root is p, and the node is numbered from 1 to n. Now define f(i) as the number of nodes whose number is less than i in all the succeeding nodes of node i. Now we need to calculate f(i) for any possible i.
Input Multiple cases (no more than 10), for each case:
The first line contains two integers n (0 Following n-1 lines, each line has two integers, representing an edge in this tree.
The input terminates with two zeros.
Output For each test case, output n integer in one line representing f(1), f(2) … f(n), separated by a space.
Sample Input
15 7
7 10
7 1
7 9
7 3
7 4
10 14
14 2
14 13
9 11
9 6
6 5
6 8
3 15
3 12
0 0

Sample Output
0 0 0 0 0 1 6 0 3 1 0 0 0 2 0
题意:求以x为根节点的子树权值和。 题解:求得dfs序之后,就是简单的求和问题,BIT/线段树均可。 因为题目是求比当前x小的,所以我们要从大的开始更新。不想手动模拟请加栈
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
   
    
#include
    
      #include
     
       #include
      
        #include
       
         #include
        
          #include
         
           #include
          
            #include
            #include
            
              #include
             
               using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair
              
               pil; const int INF = 0x3f3f3f3f; const int maxn=1e5+100; int L[maxn],R[maxn]; int c[maxn*2+10]; vector
               
                v[maxn]; int ans[maxn]; int n,rt,dfn; void dfs(int u,int pre) { L[u]=++dfn; for(int i=0;i
                
                 0) { sum+=c[x]; x-=lowbit(x); } return sum; } int main() { int x,y; while(~scanf("%d%d",&n,&rt),n+rt) { CLEAR(L,0); REP(i,n+1) v[i].clear(); for(int i=0;i
                 
                  =1;i--) { ans[i]=(query(R[i]-1)-query(L[i]))/2; update(R[i],-1); update(L[i],-1); } REPF(i,1,n) printf(i==n?"%d\n":"%d ",ans[i]); } return 0; } 
                 
                
               
              
             
            
          
         
        
       
      
     
    
   


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1533 Going Home(最小费用流) 下一篇POJ2481:Cows(树状数组)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: