fhqTreap求卡常
查看原帖
fhqTreap求卡常
371968
ningago寄寄人楼主2022/6/5 08:56

RT。

开O2过了,不开TLE 9090pts,1.07s1.07s

加读入优化1.05s1.05s

求卡常技巧

#include <cstdio>
#include <cstring>

unsigned int sd = 233;

#define N 700010

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

inline int rnd()
{
	sd ^= sd << 13;
	sd ^= sd >> 7;
	sd ^= sd << 11;
	return (int)sd;
}

struct node
{
	int lson,rson,val,key,sz;
}tr[N];
int idx,root;
#define lson(x) tr[x].lson
#define rson(x) tr[x].rson

inline int newnode(int val)
{
	tr[++idx].val = val;
	tr[idx].key = rnd();
	tr[idx].sz = 1;
	return idx;
}

inline void pushup(int k)
{
	tr[k].sz = tr[lson(k)].sz + tr[rson(k)].sz + 1;
}

void split(int k,int sz,int &x,int &y)
{
	if(!k)
		x = y = 0;
	else
	{
		if(tr[lson(k)].sz < sz)
		{
			x = k;
			split(rson(k),sz - tr[lson(k)].sz - 1,rson(k),y);
		}
		else
		{
			y = k;
			split(lson(k),sz,x,lson(k));
		}
		pushup(k);
	}
}

int merge(int x,int y)
{
	if(!x || !y)
		return x + y;
	if(tr[x].key < tr[y].key)
	{
		rson(x) = merge(rson(x),y);
		pushup(x);
		return x;
	}
	else
	{
		lson(y) = merge(x,lson(y));
		pushup(y);
		return y;
	}
}

int n;
int main()
{
	n = read();
	for(int i = 1;i <= n;i++)
		root = merge(root,newnode(i));
	int x,y;
	for(int now = n,r;now >= 1;now--)
	{
		r = read();
		r %= now;
		split(root,r,x,y);
		merge(y,x);
		split(root,1,x,root);
		printf("%d\n",tr[x].val);
	}
	return 0;
}
2022/6/5 08:56
加载中...