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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM