BZOJ P4636 蒟蒻的数列【线段树动态开点模板】

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define DB double
#define SG string
#define LL long long
#define Fp(A,B,C,D) for(A=B;A<=C;A+=D)
#define Fm(A,B,C,D) for(A=B;A>=C;A-=D)
#define Clear(A) memset(A,0,sizeof(A))
#define Copy(A,B) memcpy(A,B,sizeof(B))
using namespace std;
const LL Max=1e7+5;
const LL Inf=1e9;
LL N,Cnt=1,LSon[Max],RSon[Max],Lazy[Max];
inline LL Read(){
    LL X=0;char CH=getchar();bool F=0;
    while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
    while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
    return F?-X:X;
}
inline void Write(LL X){
    if(X<0)X=-X,putchar('-');
    if(X>9)Write(X/10);
    putchar(X%10+48);
}
void LAZY(LL P){
    if(LSon[P]){
        Lazy[LSon[P]]=max(Lazy[LSon[P]],Lazy[P]);
    }
    if(RSon[P]){
        Lazy[RSon[P]]=max(Lazy[RSon[P]],Lazy[P]);
    }
}
void Update(LL P,LL L,LL R,LL X,LL Y,LL Z){
    if(X<=L&&R<=Y){
        Lazy[P]=max(Lazy[P],Z);
        return;
    }
    LL Mid=L+R>>1;
    if(X<=Mid){
        if(!LSon[P]){
            LSon[P]=++Cnt;
        }Update(LSon[P],L,Mid,X,Y,Z);
    }
    if(Mid<Y){
        if(!RSon[P]){
            RSon[P]=++Cnt;
        }Update(RSon[P],Mid+1,R,X,Y,Z);
    }
}
LL GetSum(LL P,LL L,LL R){
    if(Lazy[P]){
        LAZY(P);
    }
    if(L==R){
        return Lazy[P];
    }LL Sum=0,Mid=L+R>>1;
    if(LSon[P]){
        Sum+=GetSum(LSon[P],L,Mid);
    } else {
        Sum+=Lazy[P]*(Mid-L+1);
    }
    if(RSon[P]){
        Sum+=GetSum(RSon[P],Mid+1,R);
    } else {
        Sum+=Lazy[P]*(R-Mid);
    }
    return Sum;
}
int main(){
    LL I,J,K;
    N=Read();
    Fp(I,1,N,1){
        LL X=Read(),Y=Read(),Z=Read();
        Update(1,1,Inf,X,Y-1,Z);
    }
    Write(GetSum(1,1,Inf));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/80669814