hdu 4027 Can you answer these queries? 线段树

线段树+剪枝优化!!!

代码如下:

 

 

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<algorithm>

 4 #include<iomanip>

 5 #include<cmath>

 6 #include<cstring>

 7 #include<string>

 8 #include<vector>

 9 #include<stdlib.h>

10 #define ll __int64

11 #define pi acos(-1.0)

12 #define lson i<<1

13 #define rson i<<1|1

14 #define MAX 100001

15 using namespace std;

16 ll a[MAX];

17 struct tree

18 {

19     int l,r;

20     ll sum;

21     bool flag;

22 }T[3*MAX];

23 void built(int i,int l,int r)

24 {

25     T[i].l=l;

26     T[i].r=r;

27     T[i].flag=1;

28     if(l==r){

29         T[i].sum=a[l];

30         if(a[l]<=1) T[i].flag=0;

31         return ;

32     }

33     int m=(l+r)>>1;

34     built(lson,l,m);

35     built(rson,m+1,r);

36     T[i].sum=T[lson].sum+T[rson].sum;

37     T[i].flag=T[lson].flag||T[rson].flag;

38 }

39 void update(int i,int l,int r)

40 {

41     if(!T[i].flag) return ;

42     if(T[i].l==l&&T[i].r==r&&l==r){

43         T[i].sum=(ll)sqrt(T[i].sum*1.0);

44         if(T[i].sum<=1) T[i].flag=0;

45         return ;

46     }

47     int m=(T[i].l+T[i].r)>>1;

48     if(r<=m) update(lson,l,r);

49     else if(l>m) update(rson,l,r);

50     else{

51         update(lson,l,m);

52         update(rson,m+1,r);

53     }

54     T[i].sum=T[lson].sum+T[rson].sum;

55     T[i].flag=T[lson].flag||T[rson].flag;

56 }

57 ll query(int i,int l,int r)

58 {

59     if(T[i].l==l&&T[i].r==r)

60         return T[i].sum;

61     int m=(T[i].l+T[i].r)>>1;

62     if(r<=m) return query(lson,l,r);

63     else if(l>m) return query(rson,l,r);

64     else return query(lson,l,m)+query(rson,m+1,r);

65     //T[i].sum=T[lson].sum+T[rson].sum;

66 }

67 int main()

68 {

69     int n,m,ca=0,i,j,q,x,y;

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

71     {

72         for(i=1;i<=n;i++) scanf("%I64d",&a[i]);

73         built(1,1,n);

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

75         printf("Case #%d:\n",++ca);

76         for(i=0;i<m;i++){

77             scanf("%d%d%d",&q,&x,&y);

78             if(x>y) swap(x,y);

79             if(q) printf("%I64d\n",query(1,x,y));

80             else update(1,x,y);

81         }

82         printf("\n");

83     }

84     return 0;

85 }
View Code

 

 

 

 

 

你可能感兴趣的:(HDU)