fhq_treap 求助80分,距离答案至差一点点
查看原帖
fhq_treap 求助80分,距离答案至差一点点
593595
_Aurore_楼主2023/5/27 20:05

如题,救救孩子吧

#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
} 
const int MAXN=1e5+10;
int T,n,m;
int rot,tot;
struct node{
	int x,y,z;
};
bool check(node A,node B){
	if(A.x==B.x){
		if(A.y==B.y) return A.z<=B.z;
		else return A.y<=B.y;
	}
	return A.x>=B.x;
}
struct fhq_treap{
	int l,r;
	int siz,key;
	node user;
}t[MAXN];
void addtag(node OJ){
	++tot;
	t[tot].key=rand();
	t[tot].siz=1;
	t[tot].user=OJ;
}
void pushup(int i){
	t[i].siz=t[t[i].l].siz+t[t[i].r].siz+1;
}
void split(int i,node v,int &l,int &r){
	if(!i){
		l=r=0;
		return ;
	}
	if(check(t[i].user,v)){
		l=i;
		split(t[i].r,v,t[i].r,r);
	}
	else{
		r=i;
		split(t[i].l,v,l,t[i].l);
	}
	pushup(i);
}
int merge(int l,int r){
	if(!l||!r) return l+r;
	if(t[l].key<=t[r].key){
		t[l].r=merge(t[l].r,r);
		pushup(l);
		return l;
	}
	t[r].l=merge(l,t[r].l);
	pushup(r);
	return r;
}
typedef unsigned int ui ;
ui seed,last=7;
ui randNum(ui& seed,ui last,const ui md){ 
    seed=seed*17+last; 
	return seed%md+1; 
}
void clear(){
	node none;
	none.x=none.y=none.z=0;
	for(int i=1;i<=tot;i++){
		t[i].l=t[i].r=0;
		t[i].user=none;
	}
	rot=tot=0;
}
void insert(node OJ){
	int l,r;
	split(rot,OJ,l,r);
	addtag(OJ);
	rot=merge(merge(l,tot),r);
}
void debug(int i){
	if(!i) return ;
	debug(t[i].l);
	cout<<t[i].user.x<<" "<<t[i].user.y<<" "<<t[i].user.z<<endl;
	debug(t[i].r);
}
void Plus(int x,int y){
	int l,r,mid;
	node OJ=t[x].user;
	split(rot,OJ,l,r);
	OJ.z--;
	split(l,OJ,l,mid);
	rot=merge(l,r);
	OJ.z++,OJ.x++,OJ.y+=y;
	t[mid].user=OJ;
	split(rot,OJ,l,r);
	rot=merge(merge(l,mid),r);
}
int query(int x){
	int l,r;
	node OJ=t[x].user;
	OJ.y--;
	split(rot,OJ,l,r);
	int ans=t[l].siz;
	rot=merge(l,r);
	return ans;
}
signed main(){
	T=read();
	while(T--){
		n=read(),m=read(),seed=read();
		clear();
		for(int i=1;i<=n;i++){
			node OJ; 
			OJ.x=OJ.y=0;
			OJ.z=i;
			insert(OJ);
		}
		while(m--){
			int id=randNum(seed,last,n),x=randNum(seed,last,n);
			Plus(id,x);
			last=query(id);
			printf("%lld\n",last);
		}
	}
	return 0;
}
2023/5/27 20:05
加载中...