【qbxt day3】线段树

先放代码

线段树模板1

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define maxn 100010
using namespace std;

LL n,m,y[maxn<<2];
char c;
LL flag;

void read(LL &x){
    x=0;c=getchar();flag=1;
    while(c<'0'||c>'9') flag=(c=='-'?-1:1),c=getchar();
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    x*=flag;
}

struct rec{
    LL l,r;
    LL sum;
    LL col;
    rec(){
        sum=col=0;
    }
    
    rec(LL ll,LL rr,LL v){
        l=ll;r=rr;
        sum=v;
        col=0;
    }
    
    void color(LL v){
        col+=v;
        sum+=(r-l+1)*v;
    }
}z[maxn<<2];

void color(LL l,LL r,LL rt,LL v){
    z[rt].color(v);
}

void push_col(LL l,LL r,LL rt){
    if(z[rt].col!=0){
        LL m=(l+r)>>1;
        color(lson,z[rt].col);
        color(rson,z[rt].col);
        z[rt].col=0;
    }
}

rec operator+(rec a,rec b){
    rec c;
    c.l=a.l;c.r=b.r;
    c.sum=a.sum+b.sum;
    return c;
}

rec query(LL l,LL r,LL rt,LL nowl,LL nowr){
    if(nowl<=l&&r<=nowr) return z[rt];
    push_col(l,r,rt);
    int m=(l+r)>>1;
    if(nowl<=m){
        if(m<nowr) return query(lson,nowl,nowr)+query(rson,nowl,nowr);
        else return query(lson,nowl,nowr);
    }
    else return query(rson,nowl,nowr);
}

void update(LL rt){
    z[rt]=z[rt<<1]+z[rt<<1|1];
}

void build(LL l,LL r,LL rt){
    if(l==r){
        z[rt]=rec(l,r,y[l]);
        return ;
    }
    LL m=(l+r)>>1;
    build(lson);
    build(rson);
    update(rt);
}

void modify(LL l,LL r,LL rt,LL nowl,LL nowr,LL v){
    if(nowl<=l&&r<=nowr){
        color(l,r,rt,v);
        return ;
    }
    push_col(l,r,rt);
    LL m=(l+r)>>1;
    if(nowl<=m) modify(lson,nowl,nowr,v);
    if(m<nowr) modify(rson,nowl,nowr,v);
    update(rt);
}

int main(){
    //read(n);read(m);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>y[i];
    build(root);
    for(int i=1;i<=m;i++){
        int s;
        cin>>s;
        if(s==2){
            LL l,r;
            read(l);read(r);
            cout<<query(root,l,r).sum<<endl;
        }
        else{
            LL l,r,v;
            read(l);read(r);read(v);
            modify(root,l,r,v);
        }
    }
}

 

 

线段树2

#include<iostream>

using namespace std;

#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxn=100010;
int y[maxn<<2];
int mul,add;

struct rec
{
    int l,r;
    int mul,add;
    int sum;
    int col;
    rec()
    {
        sum=col=0;
    }
    rec(int ll,int rr,int v)
    {
        l=ll;r=rr;
        sum=v;
        col=0;
    }
    void color(int a,int b)
    {
        mul=mul*a;add=add*a+b;
        sum=sum*a+(r-l+1)*b;
    }
}z[maxn<<2];

rec operator+(rec a,rec b)
{
    rec c;
    c.l=a.l;c.r=b.r;
    c.sum = a.sum + b.sum;
    return c;
}

void update(int rt)
{
    z[rt] = z[rt<<1] + z[rt<<1|1];
}

void color(int l,int r,int rt,int mul,int add)
{
    z[rt].color(mul,add);
}

void push_col(int l,int r,int rt)
{
    if (z[rt].mul != 0||z[rt].add!=0)
    {
        int m=(l+r)>>1;
        color(lson,z[rt].mul,z[rt].add);
        color(rson,z[rt].mul,z[rt].add);
        z[rt].col=0;
    }
}

void build(int l,int r,int rt)
{
    if (l==r)
    {
        z[rt] = rec(l,r,y[l]);
        return;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    update(rt);
}

rec query(int l,int r,int rt,int nowl,int nowr)
{
    if (nowl<=l && r<=nowr) return z[rt];
    push_col(l,r,rt);
    int m=(l+r)>>1;
    if (nowl<=m)
    {
        if (m<nowr) return query(lson,nowl,nowr)+query(rson,nowl,nowr);
        else return query(lson,nowl,nowr);
    }
    else return query(rson,nowl,nowr);
}

void modify(int l,int r,int rt,int nowl,int nowr,int mul,int add)
{
    if (nowl<=l && r<=nowr)
    {
        color(l,r,rt,mul,add);
        return;
    }
    push_col(l,r,rt);
    int m=(l+r)>>1;
    if (nowl<=m) modify(lson,nowl,nowr,mul,add);
    if (m<nowr) modify(rson,nowl,nowr,mul,add);
    update(rt);
}

int main(){
    
}

 

posted @ 2018-08-24 18:00  东方的古文明  阅读(96)  评论(0编辑  收藏  举报