萌新试图再度用平衡树来实现ODT,但是挂掉了,请求帮助
查看原帖
萌新试图再度用平衡树来实现ODT,但是挂掉了,请求帮助
264548
Tangent233楼主2021/10/1 20:22
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct chtholly
{int l,r,v;};
struct tr
{
    unsigned long long kind;
    int l,r,pri,del;
    chtholly node;
    #define l(x) tree[x].l
    #define r(x) tree[x].r
    #define p(x) tree[x].pri
    #define n(x) tree[x].node
    #define k(x) tree[x].kind
    #define d(x) tree[x].del
}tree[maxn];
int cnt;stack<int> bin;
int rt,x,y,z;
inline int count(unsigned long long x)
{
    int ans=0;
    while(x!=0)
    {
        x-=x&(-x);
        ans++;
    }
    return ans;
}
inline void update(int now)
{
    if(!now) return;
    k(now)=(1<<(n(now).v));
    if(l(now)) k(now)|=k(l(now));
    if(r(now)) k(now)|=k(r(now));
}
inline void clean(int now)
{
    l(x)=0;r(x)=0;p(x)=0;k(x)=0;
    n(x).l=n(x).r=n(x).v=0;
}
inline void pushdown(int now) 
{
    if(l(x))
        bin.push(l(x));
    if(r(x))
        bin.push(r(x));
}
//=============================================================================
int newnode(int v,int l,int r)
{
    int po;
    if(!bin.empty())
    {
        po=bin.top();
        pushdown(po);
        clean(po);
    }
    else po=cnt++;
    p(po)=rand();
    n(po).l=l;n(po).r=r,n(po).v=v;
    k(po)=(1<<n(cnt).v);
    return po;
}
void split(int now,int val,int &x,int &y)
{
    if(!now) x=y=0;
    else
    {
        if(n(now).l<=val)
        {
            x=now;
            split(r(now),val,r(now),y);
        }
        else
        {
            y=now;
            split(l(now),val,x,l(now));
        }
    }
    update(now);
}
int merge1(int x,int y)
{
    if(!x||!y) return x+y;
    if(p(x)>p(y))
    {
        r(x)=merge1(r(x),y);
        update(x);
        return x;
    }
    else
    {
        l(y)=merge1(x,l(y));
        update(y);
        return y;
    }
}
//==========================================================================
void regionsplit(int l,int r)
{
    split(rt,l-1,x,y);
    split(y,r,y,z);
    int po1=x,po2=y;
    while(r(po1)) po1=r(po1);
    while(r(po2)) po2=r(po2);
    int l1,r1,v1;
    if(n(po1).r>=l)
    {
        r1=n(po1).r,v1=n(po1).v;
        n(po1).r=l-1;
        y=merge1(newnode(v1,l,r1),y);
    }
    if(n(po2).r>r)
    {
        l1=n(po2).l,v1=n(po2).v;
        n(po2).r=r;
        z=merge1(newnode(v1,r+1,r1),z);
    }
}
void pushiron(int l,int r,int v)
{
    regionsplit(l,r);
    bin.push(y);
    rt=merge1(x,merge1(newnode(v,l,r),z));
}
int ask(int l,int r)
{
    regionsplit(l,r);
    int ans=count(k(y));
    rt=merge1(x,merge1(y,z));
    return ans;
}
int main()
{
    int n,t,m;
    //scanf("%d %d %d",&n,&t,&o)
    cin>>n>>t>>m;
    rt=newnode(1,0,n);
    for(int i=1;i<=m;i++)
    {
        char opt;int l,r,v;
        cin>>opt>>l>>r;
        if(opt=='C')
        {
            cin>>v;
            pushiron(l,r,v);
        }
        else cout<<ask(l,r)<<endl;
    }
    return 0;
}
2021/10/1 20:22
加载中...