FHQ全WA求调
查看原帖
FHQ全WA求调
911834
bangdeng楼主2024/7/17 22:32

rt

#include<bits/stdc++.h>
#define int long long
#define re register
#define ls(u) tr[u].ls
#define rs(u) tr[u].rs
using namespace std;
const int N=2e6+10;
struct node
{
	int ac,rib;
	bool operator<=(const node a)
	{
		if(ac==a.ac)return rib<=a.rib;
		else return ac>=a.ac;
	}
}a[N];
int root,cnt,T1,T2,T3,stk[N],top;
struct FHQ
{
	int ls,rs,key,siz;
	node val;
}tr[N];
void up(int u){tr[u].siz=tr[ls(u)].siz+tr[rs(u)].siz+1;}
int merge(int x,int y)
{
	if(!x||!y)return x+y;
	if(tr[x].key<tr[y].key)
	{
		rs(x)=merge(rs(x),y);
		up(x);
		return x;
	}
	else
	{
		ls(y)=merge(x,ls(y));
		up(y);
		return y; 
	}
}
void split(int u,node val,int &x,int &y)
{
	if(!u)
	{
		x=y=0;
		return;
	}
	if(tr[u].val<=val)
	{
		x=u;
		split(rs(u),val,rs(u),y);
	}
	else
	{
		y=u;
		split(ls(u),val,x,ls(u));
	}
	up(u);
}
int newnode(node val)
{
	int u;
	if(top)u=stk[top--];
	else u=++cnt;
	tr[u].key=rand();
	tr[u].siz=1;
	tr[u].ls=tr[u].rs=0;
	tr[u].val=val;
	return u;
}
void insert(node pos)
{
	split(root,pos,T1,T2);
	root=merge(merge(T1,newnode(pos)),T2);
}
void del(node pos)
{
	node p=pos;
	--p.rib;
	split(root,pos,T1,T3);
	split(T1,p,T1,T2);
	stk[++top]=T2;
	T2=merge(ls(T2),rs(T2));
	root=merge(merge(T1,T2),T3);
}
int ask_val(node pos)
{
	--pos.rib;
	split(root,pos,T1,T2);
	int r=tr[T1].siz;
	root=merge(T1,T2);
	return r;
}
typedef unsigned int ui;
	ui randNum(ui& seed, ui last, const ui m) {
    seed = seed * 17 + last;
    return seed % m + 1;
}
ui seed,last=7;
int m,n;
signed main()
{
	int T;
	scanf("%lld",&T);
	while(T--)
	{
		srand(19260817);
		root=cnt=top=0;
		cin>>m>>n>>seed;
		for(int i=1;i<=m;i++)a[i].ac=a[i].rib=0,insert(a[i]);
		int u,v;
		for(int i=1;i<=n;i++)
		{
			u=randNum(seed,last,m);
			v=randNum(seed,last,m);
			del(a[u]);
			++a[u].ac;
			a[u].rib+=v;
			insert(a[u]);
			last=ask_val(a[u]);
			printf("%lld\n",last);
		}
	}
}
2024/7/17 22:32
加载中...