PKU A Simple Problem with Integers (線段樹區間更新求和)

來源:互聯網
上載者:User

標籤: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*/


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.