fhqtreap求助,怎么会mle,是不是递归出错了
查看原帖
fhqtreap求助,怎么会mle,是不是递归出错了
264548
Tangent233楼主2021/5/16 18:55
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node
{
	int l,r;
	long long val,result;
	int key,sz;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define v(x) tree[x].val
	#define k(x) tree[x].key
	#define s(x) tree[x].sz
	#define re(x) tree[x].result
}tree[maxn];
int mod;
int cnt,rt;
int x,y,z;
inline int newnode(long long v)
{
	v(++cnt)=v%mod;
	k(cnt)=rand();
	s(cnt)=1;
	re(cnt)=v%mod;
	return cnt;
}
inline void update(int now)
{
	s(now)=s(l(now))+s(r(now))+1;
	//re(now)=max(re(l(now))%mod*re(r(now))%mod*v(now)%mod,1ll);
    re(now)=v(now)%mod;;
    if(l(now)) re(now)*=re(l(now));
    re(now)%=mod;
    if(r(now)) re(now)*=re(r(now));
    re(now)%=mod;
}
void split(int now,int siz,int &x,int &y)
{
	if(!now) x=y=0;
	else
	{
		if(s(l(now))<siz)
		{
			x=now;
			split(r(now),siz-s(l(now))-1,r(now),y);
		}
		else
		{
			y=now;
			split(l(now),siz,x,l(now));
		}
		update(now);
	}
}
int merge1(int x,int y)
{
	if(!x||!y) return x+y;
	if(k(x)<k(y))
	{
		r(x)=merge1(r(x),y);
		update(x);
		return x;
	}
	else
	{
		l(y)=merge1(x,l(y));
		update(y);
		return y;
	}
}
void del(int pos)
{
    split(rt,pos-1,x,y);
    split(y,1,y,z);
    re(y)=v(y)=1;
    rt=merge1(x,merge1(y,z));
}
int chu[maxn];
int main()
{
    int t;cin>>t;
    for(int i=1;i<=t;i++)
    {
        memset(chu,0,sizeof(chu));
        cnt=0,rt=0;
        x=y=z=0;
        int q;cin>>q>>mod;
        for(int i=1;i<=q;i++)
        {
            int op,m;
            cin>>op>>m;
            if(op==1)
            {
                rt=merge1(rt,newnode(m));
                chu[i]=cnt;
                cout<<re(rt)<<endl;
            }
            else
            {
                del(chu[m]);
                cout<<re(rt)<<endl;
            }
        }
    }
    return 0;
}

不应该啊,split和merge都是抄模板的

2021/5/16 18:55
加载中...