简单单点更新线段树

 简单线段树

hdu1166

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define maxn 50505

 5 int sum[maxn<<2];

 6 void PushUP(int rt)

 7 {

 8     sum[rt] = sum[rt<<1] + sum[rt<<1|1];

 9 }

10 void build(int l,int r,int rt)

11 {

12     if(l == r)

13     {

14         scanf("%d",&sum[rt]);

15         return;

16     }

17     int m = (l + r)/2;

18     build(lson);

19     build(rson);

20     PushUP(rt);

21 }

22 void Updata(int p,int add,int l,int r,int rt)

23 {

24     if(l == r)

25     {

26         sum[rt] += add;

27         return ;

28     }

29     int m = (l + r)/2;

30     if(p <= m)

31         Updata(p,add,lson);

32     else 

33         Updata(p,add,rson);

34     PushUP(rt);

35 }

36 int Query(int L,int R,int l,int r,int rt)

37 {

38     if(L <= l&&r <= R)

39         return sum[rt];

40     int ret = 0;

41     int m = (l + r)/2;

42     if(L > m)

43         ret += Query(L,R,rson);

44     else if(m >= R)

45         ret += Query(L,R,lson);

46     else

47     {

48         ret += Query(L,R,lson);

49         ret += Query(L,R,rson);

50     }

51     return ret;

52 }

53 int main()

54 {

55     int T , ff = 0 , n;

56     scanf("%d",&T);

57     while(T--)

58     {

59         printf("Case %d:\n",++ff);

60         scanf("%d",&n);

61         build(1,n,1);

62         char s[10];

63         while(scanf("%s",s)!=EOF)

64         {

65             if(s[0]=='E')

66                 break;

67             int a,b;

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

69             if(s[0]=='A')

70                 Updata(a,b,1,n,1);

71             else if(s[0]=='S')

72                 Updata(a,-b,1,n,1);

73             else if(s[0]=='Q')

74                 printf("%d\n",Query(a,b,1,n,1));

75         }

76     }

77 }
View Code

hdu1394

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define maxn 5500

 5 int sum[maxn<<2];

 6 int a[maxn];

 7 void PushUp(int rt)

 8 {

 9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];

10 }

11 void build(int l,int r,int rt)

12 {

13     sum[rt]=0;

14     if(l==r)

15         return;

16     int m=(l+r)/2;

17     build(lson);

18     build(rson);

19 }

20 int Query(int L,int R,int l,int r,int rt)

21 {

22     if(L<=l&&R>=r)

23         return sum[rt];

24     int m=(l+r)/2;

25     int ret=0;

26     if(m >= L)

27         ret+=Query(L,R,lson);

28     if(m < R)

29         ret+=Query(L,R,rson);

30     return ret;

31 }

32 void Updata(int p,int l,int r,int rt)

33 {

34     if(l==r)

35     {

36         sum[rt]++;

37         return;

38     }

39     int m=(r+l)/2;

40     if(m>=p)

41         Updata(p,lson);

42     else

43         Updata(p,rson);

44     PushUp(rt);

45 }

46 int main()

47 {

48     int i,n;

49     while(scanf("%d",&n)!=EOF)

50     {

51         build(1,n,1);

52         int ss=0;

53         for(i=0;i<n;i++)

54         {

55             scanf("%d",&a[i]);

56             ss+=Query(a[i],n-1,0,n-1,1);

57             Updata(a[i],0,n-1,1);

58         }

59         int ans=ss;

60         for(i=0;i<n;i++)

61         {

62             ans=ans+n-1-2*a[i];

63             if(ans<ss)

64                 ss=ans;

65         }

66         printf("%d\n",ss);

67     }

68 }
View Code

hdu2795

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define maxn 202002

 5 int sum[maxn<<2];

 6 int max(int x,int y)

 7 {

 8     return x>y?x:y;

 9 }

10 void PushUp(int rt)

11 {

12     sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);

13 }

14 void build(int l,int r,int rt,int v)

15 {    

16     sum[rt]=v;

17     if(l==r)

18     {

19         return;

20     }

21     int m=(l+r)/2;

22     build(lson,v);

23     build(rson,v);

24 //    PushUp(rt);

25 }

26 int Query(int len,int l,int r,int rt)

27 {

28     if(len>sum[rt])

29         return -1;

30     if(l==r)

31     {

32         sum[rt]-=len;

33         return l;

34     }

35     int ret;

36     int m=(l+r)/2;

37     if(len<=sum[rt<<1])

38         ret =  Query(len,lson);

39     else if(len<=sum[rt<<1|1])

40         ret =  Query(len,rson);

41     PushUp(rt);

42     return ret;

43 }

44 int main()

45 {

46     int h,w,n,i;

47     while(scanf("%d%d%d",&h,&w,&n)!=EOF)

48     {

49         if(h>n)

50             h=n;

51         build(1,h,1,w);

52         int x;

53         for(i=0;i<n;i++)

54         {

55             scanf("%d",&x);

56             if(x>sum[1])

57                 printf("-1\n");

58             else

59             {

60                 printf("%d\n",Query(x,1,h,1));

61             }

62         }

63     }

64 }
View Code

 poj2828

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define maxn 200200

 5 int sum[maxn<<2];

 6 struct node

 7 {

 8     int id;

 9     int v;

10 }a[maxn];

11 int place,map[maxn];

12 void PushUp(int rt)

13 {

14     sum[rt]=sum[rt<<1]+sum[rt<<1|1];

15 }

16 void build(int l,int r,int rt)

17 {

18     if(l==r)

19     {

20         sum[rt]=1;

21         return ;

22     }

23     int m=(l+r)/2;

24     build(lson);

25     build(rson);

26     PushUp(rt);

27 }

28 void Updata(int p,int l,int r,int rt)

29 {

30     if(l==r)

31     {

32         place=l;

33         sum[rt]--;

34         return;

35     }

36     int m=(l+r)/2;

37     if(sum[rt<<1]>=p)

38         Updata(p,lson);

39     else 

40     {

41         p=p-sum[rt<<1];

42         Updata(p,rson);

43     }

44     PushUp(rt);

45 }

46 int main()

47 {

48     int i,n;

49     while(scanf("%d",&n)!=EOF)

50     {

51         build(1,n,1);

52         for(i=0;i<n;i++)

53         {

54             scanf("%d%d",&a[i].v,&a[i].id);

55         }

56         for(i=n-1;i>=0;i--)

57         {

58             Updata(a[i].v+1,1,n,1);

59             map[place]=a[i].id;

60         }

61         for(i=1;i<=n;i++)

62         {

63             if(i==1)

64                 printf("%d",map[i]);

65             else printf(" %d",map[i]);

66         }

67         printf("\n");

68     }

69 }
View Code

hdu1698

 1 #include<stdio.h>

 2 #define lson l,m,rt<<1

 3 #define rson m+1,r,rt<<1|1

 4 #define maxn 101000

 5 int sum[maxn<<2],mark[maxn<<2];

 6 void pushup(int rt)

 7 {

 8     sum[rt]=sum[rt<<1]+sum[rt<<1|1];

 9 }

10 void build(int l,int r,int rt)

11 {

12     mark[rt]=0;

13     if(l==r)

14     {

15         sum[rt]=1;

16         return;

17     }

18     int m=(l+r)/2;

19     build(lson);

20     build(rson);

21     pushup(rt);

22 }

23 void pushdown(int rt,int len)

24 {

25     if(mark[rt])

26     {

27         mark[rt<<1|1]=mark[rt<<1]=mark[rt];

28         sum[rt<<1]=mark[rt]*(len-len/2);

29         sum[rt<<1|1]=mark[rt]*(len/2);

30         mark[rt]=0;

31     }

32 }

33 void updata(int L,int R,int c,int l,int r,int rt)

34 {

35     if(l>=L&&R>=r)

36     {

37         mark[rt]=c;

38         sum[rt]=c*(r-l+1);

39         return;

40     }

41     pushdown(rt,r-l+1);

42     int m=(l+r)/2;

43     if(m>=L)

44         updata(L,R,c,lson);

45     if(R>m)

46         updata(L,R,c,rson);

47     pushup(rt);

48 }

49 int main()

50 {

51     int n,m,t,ff=0;

52     scanf("%d",&t);

53     while(t--)

54     {

55         scanf("%d",&n);

56         build(1,n,1);

57         scanf("%d",&m);

58         while(m--)

59         {

60             int x,y,z;

61             scanf("%d%d%d",&x,&y,&z);

62             updata(x,y,z,1,n,1);

63         }

64         printf("Case %d: The total value of the hook is %d.\n",++ff,sum[1]);

65     }

66 }
View Code

你可能感兴趣的:(线段树)