標籤:style os io for 問題 ar amp size
題意:典型的線段樹C,Q問題,有n個數a[i] (1~n),C, a, b,c在[a,b]區間增加c
Q a b 求[a,b]的和。
#include<cstdio>#include<stdlib.h>#include<string.h>#include<string>#include<map>#include<cmath>#include<iostream>#include <queue>#include <stack>#include<algorithm>#include<set>using namespace std;#define INF 1e8#define eps 1e-8#define ll __int64#define maxn 100005#define mod 1000000009struct node{ll l,r,sum;ll lazy;}tree[maxn*10];ll a[maxn];void Pushup(ll rt){tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;}void Pushdown(ll rt){if(tree[rt].lazy!=0){tree[rt<<1].lazy+=tree[rt].lazy;//注意是+=,不是=;tree[rt<<1|1].lazy+=tree[rt].lazy;tree[rt<<1].sum+=(tree[rt<<1].r-tree[rt<<1].l+1)*tree[rt].lazy;tree[rt<<1|1].sum+=(tree[rt<<1|1].r-tree[rt<<1|1].l+1)*tree[rt].lazy;tree[rt].lazy=0;}}void build(ll l,ll r,ll rt){tree[rt].l=l;tree[rt].r=r;tree[rt].sum=0;tree[rt].lazy=0;if(l==r){tree[rt].sum=a[l];return;}ll mid=(l+r)/2;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);Pushup(rt);}void update(ll rt,ll l,ll r,ll v){Pushdown(rt);if(tree[rt].l==l&&tree[rt].r==r){tree[rt].lazy=v;tree[rt].sum+=(tree[rt].r-tree[rt].l+1)*v;return ;}ll mid=(tree[rt].l+tree[rt].r)>>1;if(mid<l)update(rt<<1|1,l,r,v);else if(mid>=r)update(rt<<1,l,r,v);else{update(rt<<1,l,mid,v);update(rt<<1|1,mid+1,r,v);}Pushup(rt);}ll query(ll rt,ll l,ll r){if(tree[rt].l==l&&tree[rt].r==r)return tree[rt].sum;Pushdown(rt);ll mid=(tree[rt].l+tree[rt].r)>>1,ret=0;if(mid<l)ret+=query(rt<<1|1,l,r);else if(mid>=r)ret+=query(rt<<1,l,r);else{ret+=query(rt<<1,l,mid);ret+=query(rt<<1|1,mid+1,r);}Pushup(rt);return ret;}int main(){ll n,m;while(~scanf("%I64d%I64d",&n,&m)){for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);build(1,n,1);char s[2];ll u,v,c;while(m--){scanf("%s",s);if(s[0]=='Q'){scanf("%I64d%I64d",&u,&v);printf("%I64d\n",query(1,u,v));}else {scanf("%I64d%I64d%I64d",&u,&v,&c);update(1,u,v,c);}}}return 0;}/*10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 410 221 2 3 4 5 6 7 8 9 10Q 4 4C 1 10 3C 6 10 3C 6 9 3C 8 9 -100C 7 9 3C 7 10 3C 1 10 3Q 6 10Q 6 9Q 8 9Q 7 9Q 7 10Q 1 10Q 2 4C 3 6 3Q 9 9Q 1 1Q 5 5Q 6 6Q 7 7Q 6 8*/