线段树求助,60分
查看原帖
线段树求助,60分
1386656
cyqsnd楼主2024/7/7 15:58
#include<bits/stdc++.h>
using namespace std;
int n,m,tc;
struct tree{
    int twig,hole,laz1,laz2;
}t[100100];
void pushUp(int k)
{
    t[k].twig=t[2*k].twig+t[2*k+1].twig;
    t[k].hole=t[2*k].hole+t[2*k+1].hole;
    return;
}
void pushDown(int k,int l,int r,int mid)
{
    if(t[k].laz1==0&&t[k].laz2==0)return;
    t[2*k].laz1=t[k].laz1;
    t[2*k].laz2=t[k].laz2;
    t[2*k+1].laz1=t[k].laz1;
    t[2*k+1].laz2=t[k].laz2;
    if(t[k].laz1==1&&t[k].laz2==0){
        t[2*k].twig=0;
        t[2*k+1].twig=0;
        t[2*k].hole=mid-l+1;
        t[2*k+1].hole=r-mid;
    }
    if(t[k].laz1==0&&t[k].laz2==1){
        t[2*k].twig+=t[2*k].hole;
        t[2*k+1].twig+=t[2*k+1].hole;
        t[2*k].hole=0;
        t[2*k+1].hole=0;
    }
    if(t[k].laz1==1&&t[k].laz2==1){
        t[2*k].twig=mid-l+1;
        t[2*k+1].twig=r-mid;
        t[2*k].hole=0;
        t[2*k+1].hole=0;
    }
    t[k].laz1=0;
    t[k].laz2=0;
    return;
}
void cut(int l,int r,int x,int y,int k)
{
    if(l>=x&&r<=y){
        tc+=t[k].twig;
        t[k].twig=0;
        t[k].hole=r-l+1;
        t[k].laz1=1;
        t[k].laz2=0;
        return;
    }
    int mid=(l+r)/2;
    pushDown(k,l,r,mid);
    if(mid>=x)cut(l,mid,x,y,2*k);
    if(mid<y)cut(mid+1,r,x,y,2*k+1);
    pushUp(k);
    return;
}
void plant(int l,int r,int x,int y,int k)
{
    if(l>=x&&r<=y){
        t[k].twig+=t[k].hole;
        t[k].hole=0;
        t[k].laz2=1;
        return;
    }
    int mid=(l+r)/2;
    pushDown(k,l,r,mid);
    if(mid>=x)plant(l,mid,x,y,2*k);
    if(mid<y)plant(mid+1,r,x,y,2*k+1);
    pushUp(k);
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    n++;
    for(int i=1;i<=m;i++)
    {
        int opt,x,y;
        scanf("%d%d%d",&opt,&x,&y);
        x++;
        y++;
        if(opt==0)cut(1,n,x,y,1);
        else plant(1,n,x,y,1);
    }
    printf("%d\n%d",t[1].twig,tc);
    return 0;
}
2024/7/7 15:58
加载中...