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:
",++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
",query(1,x,y));
80             else update(1,x,y);
81         }
82         printf("
");
83     }
84     return 0;
85 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3294208.html