求助:fhq treap MLE
查看原帖
求助:fhq treap MLE
177510
小蒟蒻皮皮鱼楼主2020/7/3 18:01

MLE七个点

感觉不应该啊,求解答

#include<bits/stdc++.h>
using namespace std;
#define ls (t[cnt].l)
#define rs (t[cnt].r)
typedef long long ll;
const int N = 1100005;
int read()
{
	int ans = 0;
	char c = getchar(), last = ' ';
	while(c < '0' || c > '9') last = c, c = getchar();
	while(c >= '0' && c <= '9') ans = (ans << 1) + (ans << 3) + c - '0', c = getchar();
	if(last == '-') ans = - ans;
	return ans;
}
int cnt;
unsigned long long seed = 1;
int Rand()
{
	seed *= 19260817;
	return int(seed);
}
struct tree
{
	int l, r, rad, siz;
	int val;
}t[N];

void update(int cnt)
{
	t[cnt].siz = t[ls].siz + t[rs].siz + 1;
}

int New(int x)
{
	t[++cnt].val = x;
	t[cnt].rad = Rand();
	t[cnt].siz = 1;
	return cnt;
}

void split(int cnt, int k, int &x, int &y)
{
	if(!cnt)
	{
		x = y = 0;
		return;
	}
	if(t[cnt].val <= k)
	{
		x = cnt;
		split(rs, k, rs, y);
	}
	if(t[cnt].val > k)
	{
		y = cnt;
		split(ls, k, x, ls);
	}
	update(cnt);
}

int merge(int x, int y)
{
	if(x == 0) return y;
	if(y == 0) return x;
	if(t[x].rad <= t[y].rad)
	{
		t[x].r = merge(t[x].r, y);
		update(x);
		return x;
	}
	else 
	{
		t[y].l = merge(x, t[y].l);
		update(y);
		return y;
	}
}

int kth(int cnt, int k)
{
	if(t[ls].siz + 1 == k) return t[cnt].val;
	if(t[ls].siz >= k) return kth(ls, k);
	else return kth(rs, k - t[ls].siz - 1);
}

int n, m, rt;
int last = 0, ans;

int main()
{
//	freopen("1.in", "r", stdin);
//	freopen("1.out", "w", stdout); 
	n = read(), m = read();
	for(int i = 1; i <= n; i ++)
	{
		int k;
		int x, y;
		k = read();
		split(rt, k, x, y);
		rt = merge(merge(x, New(k)), y);
	}
	int k;
	int opt, x, y, z;
	for(int i = 1; i <= m; i ++)
	{
		opt = read(), k = read();
		k ^= last;
		if(opt == 1) 
		{
			split(rt, k, x, y);
			rt = merge(merge(x, New(k)), y);
		}
		if(opt == 2)
		{
			split(rt, k, x, y);
			split(rt, k - 1, x, z);
			z = merge(t[z].l, t[z].r);
			rt = merge(merge(x, z), y); 
		}
		if(opt == 3)
		{
			split(rt, k - 1, x, y);
			last = t[x].siz + 1;
			ans ^= last;
			//printf("%lld\n", last);
			rt = merge(x, y);
		}
		if(opt == 4)
		{
			last = kth(rt, k);
			ans ^= last;
			//printf("%lld\n", last);
		}
		if(opt == 5)
		{
			split(rt, k - 1, x, y);
			last = kth(x, t[x].siz);
			ans ^= last;
			//printf("%lld\n", last);
			rt = merge(x, y);
		}
		if(opt == 6)
		{
			split(rt, k, x, y);
			last = kth(y, 1);
			ans ^= last;
			//printf("%lld\n", last);
			rt = merge(x, y);
		}
	}
	printf("%d", ans);
}
2020/7/3 18:01
加载中...