洛谷U5653 宋荣子的小饼干

题目描述

楼下机房的LYL有n个妹子,分别编号为a1,a2……an,每个妹子都拥有一定数量的小饼干。有一天,saruka没有吃晚饭,饿的不要不要的,这时,他忽然想起了LYL的妹子们有小饼干可以吃。于是,saruka就去找LYL。不过LYL并不想让saruka轻易地从自己的妹子们手中拿走小饼干,于是,LYL就给saruka出了一道题,如果saruka可以做对,就把小饼干给saruka。可是saruka已经饿的辣眼睛了,根本没有力气再来做题了,你能来帮一帮saruka嘛?题目是这样的,你要进行两种操作,一种操作是代替LYL给区间[a,b]的妹子们每人发一定数量的小饼干,另一种操作是查询一下区间[a,b]的妹子们一共拥有多少块小饼干。

输入输出格式

输入格式:

第一行有两个整数n和q,分别表示LYL的妹子的数量和要进行的操作的次数。

第二行有n个数,表示初始状态下每个妹子拥有的小饼干数。

接下来的q行,每行有一个操作:

“C a b c”表示给区间[a,b]的妹子们每人发c块小饼干;

“Q a b”表示查询一下区间[a,b]的妹子们一共有多少小饼干。

输出格式:

一共有Q行,每行一个整数,表示妹子们有的饼干数(也就是只用输出操作Q的结果)。

输入输出样例

输入样例#1:
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
输出样例#1:
4
55
9
15

说明

1 ≤ n,q ≤ 100000

0 ≤ ai ≤ 1000000000

-10000 ≤ C ≤ 10000

请注意,C的值可以为负,也就是说LYL可以从妹子手中拿走小饼干。这个家伙!!

因为题面很有趣就写了。

实际上是裸的线段树区间修改

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define ls l,mid,rt<<1
 8 #define rs mid+1,r,rt<<1|1
 9 #define LL long long
10 using namespace std;
11 const int mxn=100010;
12 struct node{
13     LL sum;
14     LL mk;
15 }t[mxn<<2];
16 LL data[mxn];
17 int n,q;
18 void update(int l,int r,int rt){
19     if(l==r){t[rt].mk=0;return;}
20     int mid=(l+r)>>1;
21     t[rt<<1].sum+=t[rt].mk*(mid-l+1);
22     t[rt<<1|1].sum+=t[rt].mk*(r-mid);
23     t[rt<<1].mk+=t[rt].mk;
24     t[rt<<1|1].mk+=t[rt].mk;
25     t[rt].mk=0;
26     return;
27 }
28 void Build(int l,int r,int rt){
29     if(l==r){
30         t[rt].sum=data[l];
31         t[rt].mk=0;
32         return;
33     }
34     int mid=(l+r)>>1;
35     Build(ls);
36     Build(rs);
37     t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
38     return;
39 }
40 void change(int L,int R,LL v,int l,int r,int rt){
41     if(L<=l && r<=R){
42         t[rt].mk+=v;
43         t[rt].sum+=v*(r-l+1);
44         return;
45     }
46     int mid=(l+r)>>1;
47     if(t[rt].mk)update(l,r,rt);
48     if(L<=mid)change(L,R,v,ls);
49     if(R>mid)change(L,R,v,rs);
50     t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
51     return;
52 }
53 LL query(int L,int R,int l,int r,int rt){
54     if(L<=l && r<=R){
55         return t[rt].sum;
56     }
57     int mid=(l+r)>>1;
58     LL res=0;
59     if(t[rt].mk)update(l,r,rt);
60     if(L<=mid)res+=query(L,R,ls);
61     if(R>mid)res+=query(L,R,rs);
62     return res;
63 }
64 int main(){
65     scanf("%d%d",&n,&q);
66     int i,j;
67     for(i=1;i<=n;i++)scanf("%d",&data[i]);
68     Build(1,n,1);
69     char op[3];int x,y;LL c;
70     while(q--){
71         scanf("%s",op);
72         if(op[0]=='Q'){
73             scanf("%d%d",&x,&y);
74             printf("%lld
",query(x,y,1,n,1));
75         }
76         else{
77             scanf("%d%d%lld",&x,&y,&c);
78             change(x,y,c,1,n,1);
79         }
80     }
81     return 0;
82 }
原文地址:https://www.cnblogs.com/SilverNebula/p/6047547.html