疑问:如何解密
查看原帖
疑问:如何解密
1120943
YangFangYe楼主2025/7/18 15:41

题目中说

xx' 表示加密后的操作数。

怎么解密?也没说是怎么加密的啊。

56pts

#include <iostream>
using namespace std;
#define long long int
const int N = 1100005;
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]


struct node {
	int s[2], val, siz, fa, cnt;
	void init(int v, int p) {
		val = v, fa = p;
		siz = 1;
		cnt = 1;
	}
	void clear() {
		s[1] = s[0] = val = siz = fa = cnt = 0;
	}
} tr[N];

int rt, id;

void pushup(int u) {
	tr[u].siz = (tr[ls(u)].siz + tr[rs(u)].siz + tr[u].cnt);
}

void rotate(int x) {
	int y = tr[x].fa;
	int z = tr[y].fa;
	bool k = tr[y].s[1] == x;
	tr[z].s[tr[z].s[1] == y] = x, tr[x].fa = z;
	tr[y].s[k] = tr[x].s[!k], tr[tr[x].s[!k]].fa = y;
	tr[x].s[!k] = y, tr[y].fa = x;
	pushup(y);
	pushup(x);
}

void splay(int x, int k) {
	while (tr[x].fa != k) {
		int y = tr[x].fa, z = tr[y].fa;
		if (z != k) {
			if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y))
				rotate(x);
			else
				rotate(y);
		}
		rotate(x);
	}
	if (!k)
		rt = x;
}

void insert(int v) {
	int u = rt, fa = 0;
	while (u) {
		if (tr[u].val == v) {
			tr[u].cnt++;
			tr[u].siz++;
			splay(u, 0);
			return;
		}
		fa = u;
		u = tr[u].s[v > tr[u].val];
	}
	u = ++id;
	if (fa)
		tr[fa].s[v > tr[fa].val] = u;
	tr[u].init(v, fa);
	splay(u, 0);
}

void find(int v) {
	int u = rt;
	while (1) {
		if (tr[u].val == v) {
			splay(u, 0);
			break;
		}
		u = tr[u].s[v > tr[u].val];
	}
}

void pre() {
	int u = ls(rt);
	while (rs(u)) {
		u = rs(u);
	}
	splay(u, 0);
}

void lst() {
	int u = rs(rt);
	while (ls(u)) {
		u = ls(u);
	}
	splay(u, 0);
}

void del(int v) {
	find(v);
	int x = ls(rt), y = rs(rt);
	if (tr[rt].cnt > 1) {
		tr[rt].cnt--, tr[rt].siz--;
	}
	else if ((!x) && (!y)) {
		tr[rt].clear();
		rt = 0;
	}
	else if (!x) {
		tr[rt].clear();
		rt = y;
		tr[y].fa = 0;
	}
	else if (!y) {
		tr[rt].clear();
		rt = x;
		tr[x].fa = 0;
	}
	else {
		int cur = rt;
		pre();
		rs(rt) = rs(cur);
		tr[rs(cur)].fa = rt;
		pushup(rt);
		tr[cur].clear();
	}
}

int get_k(int k) {
	int u = rt;
	while (1) {
		if (ls(u) && k <= tr[ls(u)].siz) {
			u = ls(u);
		}
		else {
			k -= tr[ls(u)].siz;
			if (k - tr[u].cnt <= 0) {
				splay(u, 0);
				return tr[u].val;
			}
			else {
				k -= tr[u].cnt;
				u = rs(u);
			}
		}
	}
	return 0;
}

signed main() {
	int n, m, opt, x, lastans = 0, ans = 0;// , last2;
	(void)scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		(void)scanf("%d", &x);
		insert(x);
	}
	for (int i = 1; i <= m; i++) {
		(void)scanf("%d%d", &opt, &x);
		x ^= lastans;
		if (opt == 1) {
			insert(x);
		}
		else if (opt == 2) {
			del(x);
		}
		else if (opt == 3) {
			insert(x);
			lastans = tr[ls(rt)].siz + 1;
			del(x);
		}
		else if (opt == 4) {
			lastans = get_k(x);
		}
		else if (opt == 5) {
			insert(x);
			pre();
			lastans = tr[rt].val;
			del(x);
		}
		else {
			insert(x);
			lst();
			lastans = tr[rt].val;
			del(x);
		}
		ans ^= lastans;
		
		
	}
	printf("%d\n", ans);
	return 0;
}
2025/7/18 15:41
加载中...