线段树--区间覆盖

来源:互联网 发布:牛头酋长wq二连优化 编辑:程序博客网 时间:2024/05/21 10:43
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define maxn  100010typedef long long ll;using namespace std;int a[maxn],n,q;struct node{    int l,r,sum,tag;}tr[maxn*4];void build(int id,int l,int r);void change(int id,int ql,int qr,int lazyTag);int query(int id,int ql,int qr);void pushdown(int id);int main() {    //freopen("in.txt","r",stdin);    cin>>n;        int i;    for(i=1;i<=n;i++)        cin>>a[i];    cin>>q;        build(1,1,n);        while(q--){        int o;        cin>>o;        if(o==0){            int a,b;            cin>>a>>b;            cout<<query(1,a,b)<<endl;        }        if(o==1){            int a,b,c;                        cin>>a>>b>>c;            //cout<<a<<b<<endl;            change(1,a,b,c);        }    }    return 0;}void build(int id,int l,int r){    tr[id].l=l;    tr[id].r=r;    tr[id].tag=0;    if(l==r){        tr[id].sum=a[l];        return;    }    int mid=(l+r)>>1;    build(id<<1,l,mid);    build(id<<1|1,mid+1,r);    tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;}void change(int id,int ql,int qr,int lazyTag){    int l=tr[id].l,r=tr[id].r;    if(l>=ql&&r<=qr){        tr[id].sum=(r-l+1)*lazyTag;        tr[id].tag=lazyTag;        return;    }    pushdown(id);    if(ql<=tr[id<<1].r)        change(id<<1,ql,qr,lazyTag);    if(qr>=tr[id<<1|1].l)        change(id<<1|1,ql,qr,lazyTag);    tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;}int query(int id,int ql,int qr){    int l=tr[id].l,r=tr[id].r;    if(ql<=l&&qr>=r){        return tr[id].sum;    }    pushdown(id);    int mid=(l+r)/2;    int p1=0,p2=0;    if(ql<=mid)         p1= query(id<<1,ql,qr);    if(qr>mid)         p2= query(id<<1|1,ql,qr);    tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;    return p1+p2;}void pushdown(int id){    int l=tr[id].l,r=tr[id].r;    if(tr[id].tag!=0){        int mid=(l+r)/2;        tr[id<<1].sum=(mid-l+1)*tr[id].tag;        tr[id<<1|1].sum=(r-mid)*tr[id].tag;        tr[id<<1].tag=tr[id<<1|1].tag=tr[id].tag;        tr[id].tag=0;    }}

原创粉丝点击