POJ A Simple Problem with Integers | 线段树基础练习

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 typedef long long ll;
 5 #define N 100010
 6 using namespace std;
 7 struct node
 8 {
 9     ll l,r,lz,sum;
10 }t[4*N];
11 ll read()
12 {
13     ll ret=0,neg=1;
14     char j=getchar();
15     for (;j>'9' || j<'0';j=getchar())
16     if (j=='-') neg=-1;
17     for (;j<='9' && j>='0';j=getchar())
18     ret=ret*10+j-'0';
19     return ret*neg;
20 }
21 ll n,q,a[N],l,r,k;
22 void pushup(ll p)
23 {
24     t[p].sum=t[2*p].sum+t[2*p+1].sum;
25 }
26 void pushdown(ll p)
27 {
28     if (t[p].l==t[p].r || t[p].lz==0) return;
29     ll tmp=t[p].lz,mid=(t[p].r+t[p].l)>>1;
30     t[2*p].sum+=(mid-t[p].l+1)*tmp;
31     t[2*p+1].sum+=(t[p].r-mid)*tmp;
32     t[2*p].lz+=tmp;
33     t[2*p+1].lz+=tmp;
34     t[p].lz=0;
35 }
36 void build(ll p,ll l,ll r)
37 {
38     t[p].l=l,t[p].r=r;
39     if (l!=r)
40     {
41     ll mid=l+r>>1;
42     build(2*p,l,mid);
43     build(2*p+1,mid+1,r);
44     pushup(p);
45     }
46     else
47     t[p].sum=a[l];
48 }
49 void modify(ll p,ll l,ll r,ll k)
50 {
51     ll L=t[p].l,R=t[p].r,mid=(L+R)>>1;
52     if (l==L && r==R)
53     {
54     t[p].sum+=(r-l+1)*k;
55     t[p].lz+=k;
56     return ;
57     }
58     pushdown(p);
59     if (r<=mid)
60     modify(2*p,l,r,k);
61     else if (l>mid)
62     modify(2*p+1,l,r,k);
63     else modify(2*p,l,mid,k),modify(2*p+1,mid+1,r,k);
64     pushup(p);
65 }
66 ll query(ll p,ll l,ll r)
67 {
68     ll L=t[p].l,R=t[p].r,mid=(L+R)>>1;
69     if (l==L && r==R)
70     return t[p].sum;
71     pushdown(p);
72     if (r<=mid)
73     return query(2*p,l,r);
74     if (l>mid) return query(2*p+1,l,r);
75     return query(2*p,l,mid)+query(2*p+1,mid+1,r);
76 }
77 char op[N];
78 int main()
79 {
80     n=read(),q=read();
81     for (int i=1;i<=n;i++)
82     a[i]=read();
83     build(1,1,n);
84     while (q--)
85     {
86     scanf("%s",op);
87     if (op[0]=='Q')
88         l=read(),r=read(),printf("%lld
",query(1,l,r));
89     else l=read(),r=read(),k=read(),modify(1,l,r,k);
90     }
91     return 0;
92 }
原文地址:https://www.cnblogs.com/mrsheep/p/7866372.html