bzoj3212 pku3468 A Simple Problem with Integers

一个有初值的数列、区间加、区间查

用线段树直接水过

然而并没有1A,主要是做题太快没看规模结果没注意线段树要用longlong建

卧槽怎么可以这么坑爹,害得我看见wa心慌了,还以为连线段树都要跪

一开始在写下传(MDZZ)然后发现没什么操作就删了

 1 #include <cstdio>
 2 #include <iostream>
 3 #define mid (l+r)/2
 4 long long t[400001],tr[400001];
 5 int n,m;
 6 void add(int now,int l,int r,int x,int y)
 7 {
 8     t[now]+=y;
 9     if(l==r)
10         return;
11     if(x<=mid)
12         add(now*2,l,mid,x,y);
13     else
14         add(now*2+1,mid+1,r,x,y);
15 }
16 void plus(int now,int l,int r,int x,int y,int z)
17 {
18     if(l==x && r==y)
19     {
20         tr[now]+=z;
21         return;
22     }
23     if(x<=mid)
24         plus(now*2,l,mid,x,std::min(y,mid),z);
25     if(y>mid)
26         plus(now*2+1,mid+1,r,std::max(x,mid+1),y,z);
27     t[now]=t[now*2]+tr[now*2]*(mid-l+1)+t[now*2+1]+tr[now*2+1]*(r-mid);
28 }
29 long long que(int now,int l,int r,int x,int y)
30 {
31     if(l==x && r==y)
32         return t[now]+tr[now]*(r-l+1);
33     long long sum=(y-x+1)*tr[now];
34     if(x<=mid)
35         sum+=que(now*2,l,mid,x,std::min(y,mid));
36     if(y>mid)
37         sum+=que(now*2+1,mid+1,r,std::max(x,mid+1),y);
38     return sum;
39 }
40 int main()
41 {
42     scanf("%d%d",&n,&m);
43     for(int i=1;i<=n;i++)
44     {
45         int x;
46         scanf("%d",&x);
47         add(1,1,n,i,x);
48     }
49     for(int i=1;i<=m;i++)
50     {
51         char ch=getchar();
52         for(;ch!='C' && ch!='Q';ch=getchar());
53         if(ch=='C')
54         {
55             int x,y,z;
56             scanf("%d%d%d",&x,&y,&z);
57             plus(1,1,n,x,y,z);
58         }
59         else
60         {
61             int x,y;
62             scanf("%d%d",&x,&y);
63             printf("%lld
",que(1,1,n,x,y));
64         }
65     }
66     return 0;
67 } 
原文地址:https://www.cnblogs.com/wanglichao/p/5684426.html