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 }