poj3468—線段樹

來源:互聯網
上載者:User
//線段樹成段更新//和其他題相似,注意在更新時值可以超出int範圍,在乘的時候,應乘1ll強制類型轉換#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 100005typedef __int64 i64;int n,m,t;i64 sum;int ans[N];char str[2];struct TNode{    int l,r;    i64 sum,cal;} node[4*N];void build(int root,int l,int r){    node[root].sum=node[root].cal=0;    node[root].l=l,node[root].r=r;    if(l==r)    {        node[root].sum=ans[l];        return ;    }    int mid=(l+r)>>1,p=root<<1;    build(p,l,mid);    build(p+1,mid+1,r);    node[root].sum=node[p].sum+node[p+1].sum;}void insert(int root,int l,int r,int c){    int mid,p=root<<1;    if(node[root].l==l&&node[root].r==r)    {        node[root].cal+=c;        node[root].sum+=c*(node[root].r-node[root].l+1);        return ;    }    if(node[root].cal!=0)    {        node[p].cal+=node[root].cal,node[p].sum+=node[root].cal*1ll*(node[p].r-node[p].l+1);        node[p+1].cal+=node[root].cal,node[p+1].sum+=node[root].cal*1ll*(node[p+1].r-node[p+1].l+1);        node[root].cal=0;    }    mid=(node[root].l+node[root].r)>>1;    if(r<=mid) insert(p,l,r,c);    else if(l>mid) insert(p+1,l,r,c);    else    {        insert(p,l,mid,c);        insert(p+1,mid+1,r,c);    }    node[root].sum=node[p].sum+node[p+1].sum;}void query(int root,int l,int r){    int mid,p;    mid=(node[root].l+node[root].r)>>1;    p=root<<1;    if(node[root].l==l&&node[root].r==r)    {        sum+=node[root].sum;        return ;    }    if(node[root].cal!=0)    {        node[p].cal+=node[root].cal,node[p].sum+=node[root].cal*1ll*(node[p].r-node[p].l+1);        node[p+1].cal+=node[root].cal,node[p+1].sum+=node[root].cal*1ll*(node[p+1].r-node[p+1].l+1);        node[root].cal=0;    }    if(r<=mid) query(p,l,r);    else if(l>mid) query(p+1,l,r);    else    {        query(p,l,mid);        query(p+1,mid+1,r);    }}int main(){    int l,r,c;    scanf("%d%d",&n,&m);    for(l=1; l<=n; l++) scanf("%d",&ans[l]);    build(1,1,n);    while(m--)    {        scanf("%s%d%d",str,&l,&r);        if(l>r) swap(l,r);        if(str[0]=='C')        {            scanf("%d",&c);            insert(1,l,r,c);        }        else        {            sum=0;            query(1,l,r);            printf("%I64d\n",sum);        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.