线段树求调
查看原帖
线段树求调
592080
CQBZ_ZJYjoe楼主2025/1/25 15:44
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxn=300005;
int n,m;
struct Node
{
    int d,l,r,lx,rx,beg,edn,tag,flag;
    Node()
    {
        tag=-1;
    }
}tr[maxn*4];
void pushdown(int x)
{
    if (tr[x].tag==1)
    {
        tr[x<<1].d=tr[x<<1].lx=tr[x<<1].rx=tr[x<<1].beg=tr[x<<1].edn=0;
        tr[x<<1].tag=1;
        tr[(x<<1)+1].d=tr[(x<<1)+1].lx=tr[(x<<1)+1].rx=tr[(x<<1)+1].beg=tr[(x<<1)+1].edn=0;
        tr[(x<<1)+1].tag=1;
        tr[x].tag=-1;
    }
    else if (tr[x].tag==0)
    {
        tr[x<<1].d=tr[x<<1].lx=tr[x<<1].rx=tr[x<<1].r-tr[x<<1].l+1;
        tr[x<<1].beg=tr[x<<1].l;
        tr[x<<1].edn=tr[x<<1].r;
        tr[x<<1].tag=0;
        tr[(x<<1)+1].d=tr[(x<<1)+1].lx=tr[(x<<1)+1].rx=tr[(x<<1)+1].r-tr[(x<<1)+1].l+1;
        tr[(x<<1)+1].beg=tr[(x<<1)+1].l;
        tr[(x<<1)+1].edn=tr[(x<<1)+1].r;
        tr[(x<<1)+1].tag=0;
        tr[x].tag=-1;
    }
    if (tr[x<<1].flag)
    {
        tr[x].lx=tr[x<<1].lx;
        if (tr[(x<<1)+1].flag&&tr[x<<1].lx==tr[x<<1].r-tr[x<<1].l+1)
            tr[x].lx+=tr[(x<<1)+1].lx;
    }
    else if (tr[(x<<1)+1].flag)
        tr[x].lx=tr[(x<<1)+1].lx;
    if (tr[(x<<1)+1].flag)
    {
        tr[x].rx=tr[(x<<1)+1].rx;
        if (tr[x<<1].flag&&tr[(x<<1)+1].rx==tr[(x<<1)+1].r-tr[(x<<1)+1].l+1)
            tr[x].rx+=tr[(x<<1)].rx;
    }
    else if (tr[x<<1].flag)
        tr[x].rx=tr[x<<1].flag;
    if (tr[x<<1].flag)
    {
        tr[x].d=tr[x<<1].d;
        tr[x].beg=tr[x<<1].beg;
        tr[x].edn=tr[x<<1].edn;
    }
    if (tr[x<<1].flag&&tr[(x<<1)+1].flag&&tr[x<<1].rx+tr[(x<<1)+1].lx>tr[x].d)
    {
        tr[x].d=tr[x<<1].rx+tr[(x<<1)+1].lx;
        tr[x].beg=tr[x<<1].r-tr[x<<1].rx+1;
        tr[x].edn=tr[(x<<1)+1].l+tr[(x<<1)+1].lx-1;
    }
    if (tr[(x<<1)+1].flag&&tr[(x<<1)+1].d>tr[x].d)
    {
        tr[x].d=tr[(x<<1)+1].d;
        tr[x].beg=tr[(x<<1)+1].beg;
        tr[x].edn=tr[(x<<1)+1].edn;
    }
}
void build(int x,int l,int r)
{
    tr[x].l=l,tr[x].r=r,tr[x].flag=1;
    if (l==r)
    {
        tr[x].d=tr[x].lx=tr[x].rx=1;
        tr[x].beg=tr[x].edn=l;
        return ;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build((x<<1)+1,mid+1,r);
    if (tr[x<<1].flag)
    {
        tr[x].lx=tr[x<<1].lx;
        if (tr[(x<<1)+1].flag&&tr[x<<1].lx==tr[x<<1].r-tr[x<<1].l+1)
            tr[x].lx+=tr[(x<<1)+1].lx;
    }
    else if (tr[(x<<1)+1].flag)
        tr[x].lx=tr[(x<<1)+1].lx;
    if (tr[(x<<1)+1].flag)
    {
        tr[x].rx=tr[(x<<1)+1].rx;
        if (tr[x<<1].flag&&tr[(x<<1)+1].rx==tr[(x<<1)+1].r-tr[(x<<1)+1].l+1)
            tr[x].rx+=tr[(x<<1)].rx;
    }
    else if (tr[x<<1].flag)
        tr[x].rx=tr[x<<1].flag;
    if (tr[x<<1].flag)
    {
        tr[x].d=tr[x<<1].d;
        tr[x].beg=tr[x<<1].beg;
        tr[x].edn=tr[x<<1].edn;
    }
    if (tr[x<<1].flag&&tr[(x<<1)+1].flag&&tr[x<<1].rx+tr[(x<<1)+1].lx>tr[x].d)
    {
        tr[x].d=tr[x<<1].rx+tr[(x<<1)+1].lx;
        tr[x].beg=tr[x<<1].r-tr[x<<1].rx+1;
        tr[x].edn=tr[(x<<1)+1].l+tr[(x<<1)+1].lx-1;
    }
    if (tr[(x<<1)+1].flag&&tr[(x<<1)+1].d>tr[x].d)
    {
        tr[x].d=tr[(x<<1)+1].d;
        tr[x].beg=tr[(x<<1)+1].beg;
        tr[x].edn=tr[(x<<1)+1].edn;
    }
}
void modify_0(int x,int l,int r)
{
    if (tr[x].l>=l&&tr[x].r<=r)
    {
        tr[x].d=tr[x].lx=tr[x].rx=tr[x].r-tr[x].l+1;
        tr[x].beg=tr[x].l;
        tr[x].edn=tr[x].r;
        tr[x].tag=0;
        return ;
    }
    int mid=(tr[x].l+tr[x].r)>>1;
    pushdown(x);
    if (mid>=l)
        modify_0(x<<1,l,r);
    if (mid<r)
        modify_0((x<<1)+1,l,r);
    if (tr[x<<1].flag)
    {
        tr[x].lx=tr[x<<1].lx;
        if (tr[(x<<1)+1].flag&&tr[x<<1].lx==tr[x<<1].r-tr[x<<1].l+1)
            tr[x].lx+=tr[(x<<1)+1].lx;
    }
    else if (tr[(x<<1)+1].flag)
        tr[x].lx=tr[(x<<1)+1].lx;
    if (tr[(x<<1)+1].flag)
    {
        tr[x].rx=tr[(x<<1)+1].rx;
        if (tr[x<<1].flag&&tr[(x<<1)+1].rx==tr[(x<<1)+1].r-tr[(x<<1)+1].l+1)
            tr[x].rx+=tr[(x<<1)].rx;
    }
    else if (tr[x<<1].flag)
        tr[x].rx=tr[x<<1].flag;
    if (tr[x<<1].flag)
    {
        tr[x].d=tr[x<<1].d;
        tr[x].beg=tr[x<<1].beg;
        tr[x].edn=tr[x<<1].edn;
    }
    if (tr[x<<1].flag&&tr[(x<<1)+1].flag&&tr[x<<1].rx+tr[(x<<1)+1].lx>tr[x].d)
    {
        tr[x].d=tr[x<<1].rx+tr[(x<<1)+1].lx;
        tr[x].beg=tr[x<<1].r-tr[x<<1].rx+1;
        tr[x].edn=tr[(x<<1)+1].l+tr[(x<<1)+1].lx-1;
    }
    if (tr[(x<<1)+1].flag&&tr[(x<<1)+1].d>tr[x].d)
    {
        tr[x].d=tr[(x<<1)+1].d;
        tr[x].beg=tr[(x<<1)+1].beg;
        tr[x].edn=tr[(x<<1)+1].edn;
    }
}
void modify_1(int x,int l,int r)
{
    if (tr[x].l>=l&&tr[x].r<=r)
    {
        tr[x].d=tr[x].lx=tr[x].rx=tr[x].beg=tr[x].edn=0;
        tr[x].tag=1;
        return ;
    }
    int mid=(tr[x].l+tr[x].r)>>1;
    pushdown(x);
    if (mid>=l)
        modify_1(x<<1,l,r);
    if (mid<r)
        modify_1((x<<1)+1,l,r);
    if (tr[x<<1].flag)
    {
        tr[x].lx=tr[x<<1].lx;
        if (tr[(x<<1)+1].flag&&tr[x<<1].lx==tr[x<<1].r-tr[x<<1].l+1)
            tr[x].lx+=tr[(x<<1)+1].lx;
    }
    else if (tr[(x<<1)+1].flag)
        tr[x].lx=tr[(x<<1)+1].lx;
    if (tr[(x<<1)+1].flag)
    {
        tr[x].rx=tr[(x<<1)+1].rx;
        if (tr[x<<1].flag&&tr[(x<<1)+1].rx==tr[(x<<1)+1].r-tr[(x<<1)+1].l+1)
            tr[x].rx+=tr[(x<<1)].rx;
    }
    else if (tr[x<<1].flag)
        tr[x].rx=tr[x<<1].flag;
    if (tr[x<<1].flag)
    {
        tr[x].d=tr[x<<1].d;
        tr[x].beg=tr[x<<1].beg;
        tr[x].edn=tr[x<<1].edn;
    }
    if (tr[x<<1].flag&&tr[(x<<1)+1].flag&&tr[x<<1].rx+tr[(x<<1)+1].lx>tr[x].d)
    {
        tr[x].d=tr[x<<1].rx+tr[(x<<1)+1].lx;
        tr[x].beg=tr[x<<1].r-tr[x<<1].rx+1;
        tr[x].edn=tr[(x<<1)+1].l+tr[(x<<1)+1].lx-1;
    }
    if (tr[(x<<1)+1].flag&&tr[(x<<1)+1].d>tr[x].d)
    {
        tr[x].d=tr[(x<<1)+1].d;
        tr[x].beg=tr[(x<<1)+1].beg;
        tr[x].edn=tr[(x<<1)+1].edn;
    }
}
int ask(int x,int d)
{
    pushdown(x);
    if (tr[x].l==tr[x].r)
        return (d==tr[x].d)?tr[x].beg:-1;
    if (tr[x<<1].flag&&tr[x<<1].d>=d)
        return ask(x<<1,d);
    if (tr[x<<1].flag&&tr[(x<<1)+1].flag&&tr[x<<1].rx+tr[(x<<1)+1].lx>=d)
        return tr[x<<1].beg;
    if (tr[(x<<1)+1].flag&&tr[(x<<1)+1].d>=d)
        return tr[x].beg;
    return -1;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    #ifndef ONLINE_JUDGE
        freopen("seat.in","r",stdin);
        freopen("seat.out","w",stdout);
    #endif
    cin>>n>>m;
    build(1,1,n);
    int ans=0;
    for (int i=1;i<=m;i++)
    {
        char op;
        int x,y;
        cin>>op>>x;
        if (op=='A')
        {
            int t=ask(1,x);
            cerr<<t<<'\n';
            if (t==-1)
                ans++;
            else 
                modify_1(1,t,t+x-1);
        }
        else
        {
            cin>>y;
            modify_0(1,x,y);
        }
    }
    cout<<ans;
    return 0;
}
2025/1/25 15:44
加载中...