HDU 4217 Data Structure?

9360 ワード


線分ツリーの単点更新の適用.
タイトルリンクhttp://acm.hdu.edu.cn/showproblem.php?pid=4217


View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<stdlib.h>

 4 #define N 1000000

 5 __int64 temp;

 6 struct node

 7 {

 8     __int64 l,r;

 9     __int64 sum;

10 }xtree[4*N];

11 void pushup(int rn)

12 {

13     xtree[rn].sum=xtree[rn<<1].sum+xtree[rn<<1|1].sum;

14 }

15 void build(__int64 l,__int64 r,__int64 rn)

16 {

17     xtree[rn].l=l;

18     xtree[rn].r=r;

19     if(l==r)

20     {

21         xtree[rn].sum=1;

22         return ;

23     }

24     __int64 mid=(l+r)>>1;

25     build(l,mid,rn<<1);

26     build(mid+1,r,rn<<1|1);

27     pushup(rn);

28 }

29 void update(__int64 val,__int64 l,__int64 r,int rn)

30 {

31     if(l==r)

32     {

33         temp+=l;

34         xtree[rn].sum=0;

35         return ;

36     }

37     int mid=(l+r)>>1;

38     if(val<=xtree[rn<<1].sum)

39     {

40         update(val,l,mid,rn<<1);

41     }

42     else

43     {

44         update(val-xtree[rn<<1].sum,mid+1,r,rn<<1|1);

45     }

46     pushup(rn);

47 }

48 int main()

49 {

50     __int64 n,m,a,t,c=1;

51     scanf("%I64d",&n);

52     while(n--)

53     {

54         temp=0;

55         scanf("%I64d",&m);

56         build(1,m,1);

57         scanf("%I64d",&t);

58         while(t--)

59         {

60             scanf("%I64d",&a);

61             update(a,1,m,1);

62         }

63         printf("Case %I64d: ",c);

64         printf("%I64d
",temp); 65 c++; 66 } 67 return 0; 68 }