空间跟题解开的一样,但MLE,为什么
查看原帖
空间跟题解开的一样,但MLE,为什么
396994
Winston12321_楼主2023/6/30 20:49

AC几个点,MLE几个点,WA几个点 MLE的点跑得挺快,WA的点下不了数据没能调

#include <iostream>
using namespace std;
typedef long long ll;
const int N=4e5+10; 
int n,m;
int rt[N],tot;
int p,q,xx;
int cnt,bc[N*20],cc;
int v,opt,num,num2,tmp;
struct node{
    int lson,rson;
	ll sz;
}t[N*20];
void del(int id)
{
	bc[++cc]=id;
	t[id].lson=0;
	t[id].rson=0;
	t[id].sz=0;
}
int nd()
{
	if(cc) return bc[cc--];
	else return ++cnt;
}
void pushup(int id)
{
    t[id].sz=t[t[id].lson].sz+t[t[id].rson].sz;
}
void add(int id,int l,int r,int u,int x)
{
    if(l==r) return t[id].sz+=x,void();
    t[id].sz+=x;
    int mid=l+r>>1;
    if(u<=mid)
    {
        if(!t[id].lson) t[id].lson=nd();
        add(t[id].lson,l,mid,u,x);
    }
    else
    {
        if(!t[id].rson) t[id].rson=nd();
        add(t[id].rson,mid+1,r,u,x);
    }
}
int merge(int x,int y)
{
    if(!x || !y) return x|y;
    t[x].sz+=t[y].sz;
    t[x].lson=merge(t[x].lson,t[y].lson);
    t[x].rson=merge(t[x].rson,t[y].rson);
    del(y);
    return x;
}
ll ask(int id,int l,int r,int ll,int rr)
{
    if(l==ll && r==rr) return t[id].sz;
    int mid=l+r>>1;
    if(rr<=mid) return ask(t[id].lson,l,mid,ll,rr);
    else if(ll>mid) return ask(t[id].rson,mid+1,r,ll,rr);
    else return ask(t[id].lson,l,mid,ll,mid)+ask(t[id].rson,mid+1,r,mid+1,rr);
}
int kth(int id,int l,int r,ll k)
{
    if(l==r) return l;
    int mid=l+r>>1;
    if(t[t[id].lson].sz>=k) return kth(t[id].lson,l,mid,k);
    else return kth(t[id].rson,mid+1,r,k-t[t[id].lson].sz);
}
void split(int x,int &y,ll k)
{
	if(!x) return;
    y=nd();
    if(t[t[x].lson].sz>=k) swap(t[x].rson,t[y].rson);
    if(t[t[x].lson].sz>k) split(t[x].lson,t[y].lson,k);
    else if(t[t[x].lson].sz<k) split(t[x].rson,t[y].rson,k-t[t[x].lson].sz);
    t[y].sz=t[x].sz-k;
	t[x].sz=k;
}
signed main()
{
    cin>>n>>m;
    rt[1]=1;
    cnt=tot=1;
    for(int i=1;i<=n;++i)
    {
        cin>>v;
        add(1,1,n,i,v);
    }
    for(int i=1;i<=m;++i)
    {
        cin>>opt;
        if(opt==0)
        {
			cin>>xx>>p>>q;
			num=ask(rt[xx],1,n,1,p-1),num2=ask(rt[xx],1,n,1,q);
			split(rt[xx],rt[++tot],num);
			split(rt[tot],tmp,num2-num);
			rt[xx]=merge(rt[xx],tmp);
        }
        else if(opt==1)
        {
            cin>>p>>q;
            rt[p]=merge(rt[p],rt[q]);
        }
        else if(opt==2)
        {
            cin>>p>>xx>>q;
            add(rt[p],1,n,q,xx);
        }
        else if(opt==3)
        {
            cin>>xx>>p>>q;
            cout<<ask(rt[xx],1,n,p,q)<<endl;
        }
        else
        {
            cin>>p>>q;
            if(t[rt[p]].sz<q || q<1) cout<<-1<<endl;
            else cout<<kth(rt[p],1,n,q)<<endl;
        }
    }
    return 0;
}
2023/6/30 20:49
加载中...