JZ初中OJ 1567. [GDKOI]简单题

题目描述

    给你N个整数A1,A2,….,AN,你可以进行两种操作:一种把一给定区间的每个数是增加一个值;另一种是计算某一给定区间的数字的和。
 

输入

    第一行包含两个整数N和Q.1<=N,Q<=100000

第二行包含N个整数,是A1,A 2,….,AN的初始值。-1000000000<=Ai<=1000000000

接下来Q行,描述操作。

“C a b c”表示把Aa,Aa+1,….Ab都增加c,-10000<=c<=10000。

“Q a b”表示询问Aa,Aa+1,….,Ab的和。

输出

对于每个询问输出对应的和,每行一个。
 

样例输入

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4

样例输出

4
55
9
15
 

数据范围限制

【限制】

30%数据 N,Q<=10000
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long n,q,d,s,c1[100001],sum1[100001],c2[100001],a[100001];
 4 char w;
 5 long long lowbit(long long x)
 6 {
 7     return x&(-x);
 8 }
 9 long long sum(long long c[],long long x)
10 {
11     long long ret=0;
12     while(x>0)
13     {
14         ret+=c[x];
15         x-=lowbit(x);
16     }
17     return ret;
18 }
19 void add(long long c[],long long x,long long y)
20 {
21     while(x<=n)
22     {
23         c[x]+=y;
24         x+=lowbit(x);
25     }
26 }
27 int main()
28 {
29     freopen("simple.in","r",stdin);
30     freopen("simple.out","w",stdout);
31     cin>>n>>q;
32     for(int i=1;i<=n;i++)
33     {
34         cin>>a[i];
35         sum1[i]=sum1[i-1]+a[i];
36     }
37     for(int j=1;j<=q;j++)
38     {
39         cin>>w;
40         cin>>s>>d;
41         if(int(w)==int('Q'))
42         {
43             long long suml=sum1[s-1]+s*sum(c1,s-1)-sum(c2,s-1);
44             long long sumd=sum1[d]+(d+1)*sum(c1,d)-sum(c2,d);
45             cout<<sumd-suml<<endl; 
46         }
47         else 
48         {
49             long long cost;
50             cin>>cost;
51             add(c1,s,cost);
52             add(c1,d+1,-cost);
53             add(c2,s,s*cost);
54             add(c2,d+1,-(d+1)*cost);
55         }
56     }
57     return 0;
58 }

猜你喜欢

转载自www.cnblogs.com/anbujingying/p/11305911.html