求hack
查看原帖
求hack
149192
__gcd楼主2021/5/30 22:42

WA 10pts,本地对拍无误,求 hack。

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline int read() {
	int x = 0; bool op = false;
	char c = getchar();
	while(!isdigit(c))op |= (c == '-'), c = getchar();
	while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return op ? -x : x;
}
const int N = 100210;
int n, m, rt, test, tot, seed = 1;
struct Node {
	int ls, rs, key, sz;
	string s;
}tr[N];
int rnd() {return seed *= 19260817;}
void add(string s) {
	tr[++tot].ls = tr[tot].rs = 0;	
	tr[tot].sz = 1; tr[tot].key = rnd(); tr[tot].s = s;
	return ;
}
void pushup(int k) {tr[k].sz = tr[tr[k].ls].sz + tr[tr[k].rs].sz + 1;}
void split(int k, int &a, int &b, int x) {
	if(k == 0) {a = b = 0; return ;}
	if(tr[tr[k].ls].sz + 1 <= x) {a = k; split(tr[k].rs, tr[k].rs, b, x - tr[tr[k].ls].sz - 1);}
	else {b = k; split(tr[k].ls, a, tr[k].ls, x);}
	pushup(k);
	return ;
}
void merge(int &k, int a, int b) {
	if(a == 0 || b == 0) {k = a + b; return ;}
	if(tr[a].key < tr[b].key) {k = a; merge(tr[k].rs, tr[k].rs, b);}
	else {k = b; merge(tr[k].ls, a, tr[k].ls);}
	pushup(k);
	return ;
}
int main() {
	n = read();
	for(int i = 1; i <= n; i++) {
		string s; cin >> s;
		add(s); merge(rt, rt, tot);
	}
	m = read();
	for(int i = 1; i <= m; i++) {
		string s; cin >> s; int x = read();
		add(s);
		int a = 0, b = 0;
		split(rt, a, b, x); merge(a, a, tot); merge(rt, a, b);
	}
	int test = read();
	while(test--) {
		int x = read();
		int a = 0, b = 0, c = 0;
		split(rt, a, b, x); 
		split(b, c, b, 1);
		cout << tr[c].s << endl;
		merge(b, c, b); 
		merge(rt, a, b);
	}
	return 0;
}

2021/5/30 22:42
加载中...