FHQ-treap 没过样例 44pts 求调
查看原帖
FHQ-treap 没过样例 44pts 求调
1179295
cyzxcrzwyz楼主2025/1/26 18:39

记录详情

#include <bits/stdc++.h>
#define lc(x) tre[x].lc
#define rc(x) tre[x].rc
#define siz(x) tre[x].siz
#define val(x) tre[x].val
#define key(x) tre[x].key 

using namespace std;

const int N = 2e6 + 5;

int n, m, tot, last, ans, rot, l, r;

struct node{
	int val, key;
	int siz;
	int lc, rc;
}tre[N];

int get_rand(){
	return rand();	
}

void pushup(int u){ siz(u) = siz(lc(u)) + siz(rc(u)) + 1; }

int newnode(int val){
	++ tot;
	lc(tot) = rc(tot) = 0;
	val(tot) = val;
	siz(tot) = 1;
	key(tot) = get_rand();
	return tot;
}

void split(int u, int x, int &l, int &r){
	if(!u){
		l = r = 0;
		return ;
	}
	if(val(u)<=x){
		l = u;
		split(rc(u), x, rc(u), r);
	}else{
		r = u;
		split(lc(u), x, l, lc(u));	
	}
	pushup(u);
}

int merge(int u, int v){
	if(!u || !v)
		return u | v;
	if(key(u) <= key(v)){
		rc(u) = merge(rc(u), v);
		pushup(u);
		return u;
	}else{
		lc(v) = merge(u, lc(v));
		pushup(v);
		return v;	
	}
}

int kth(int u, int k){
	if(k <= siz(lc(u)))
		return kth(lc(u), k);
	else if(k == siz(lc(u)) + 1)
		return u;
	else{
		k -= (siz(lc(u)) + 1);
		return kth(rc(u), k);
	}
}

int main(){
	srand(time(0));
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; ++i){
		int a;
		scanf("%d", &a);
		rot = merge(newnode(a), rot);
	}
	for(int i = 1; i <= m; ++i){
		int op, x;
		scanf("%d %d", &op, &x);
		x ^= last;
		if(op == 1){
			split(rot, x, l, r);
			newnode(x);
			rot = merge(merge(l, tot), r);
		}
		if(op == 2){
			int p;
			split(rot, x, l, r);
			split(l, x - 1, l, p);
			p = merge(lc(p), rc(p));
			rot = merge(merge(l, p), r);
		}
		if(op == 3){
			split(rot, x - 1, l, r);
			last = siz(l) + 1;
			ans ^= last;
			rot = merge(l, r);
		}
		if(op == 4){
			last = val(kth(rot, x));
			ans ^= last;
		}
		if(op == 5){
			split(rot, x - 1, l, r);
			last = val(kth(l, siz(l)));
			ans ^= last;
			rot = merge(l, r);
		}
		if(op == 6){
			split(rot, x, l, r);
			last = val(kth(r, 1));
			ans ^= last;	
			rot = merge(l, r);
		}
	}
	printf("%d\n", ans);
	return 0;	
}
2025/1/26 18:39
加载中...