fhq_treap 灵异现象②
查看原帖
fhq_treap 灵异现象②
142969
GI录像机楼主2024/7/26 08:51

我的代码一直 RE + TLE,翻到这个帖子后把数组大小改大,不开 O2,用 C++14 就过了。why?

#include<bits/stdc++.h>
using namespace std;
int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (c > '9' || c < '0') {
        if (c == '-')f = -1;
        c = getchar();
    }
    while (c <= '9' && c >= '0') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9)write(x / 10);
    putchar(x % 10 + '0');
}
const int N = 1e8 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
int ch[N][2], val[N], rd[N], siz[N], rt, tot, n = read();
void pushup(int pos) {
	siz[pos] = siz[ch[pos][0]] + siz[ch[pos][1]] + 1;
}
void split(int pos, int k, int &x, int &y) {
	if(!pos)x = y = 0;
	else {
		if(val[pos] <= k)x = pos, split(ch[pos][1], k, ch[pos][1], y);
		else y = pos, split(ch[pos][0], k, x, ch[pos][0]);
		pushup(pos);
	}
}
int merge(int x, int y) {
	if(!x || !y)return x + y;
	if(rd[x] < rd[y]) {
		ch[x][1] = merge(ch[x][1], y);
		pushup(x);
		return x;
	} else {
		ch[y][0] = merge(x, ch[y][0]);
		pushup(y);
		return y;
	}
}
int new_node(int k) {
	siz[++tot] = 1;
	val[tot] = k;
	rd[tot] = rand();
	return tot;
}
void ins(int k) {
	int x, y;
	split(rt, k, x, y);
	rt = merge(merge(x, new_node(k)), y);
}
void del(int k) {
	int x, y, z;
	split(rt, k, x, y);
	split(x, k - 1, x, z);
	z = merge(ch[z][0], ch[z][1]);
	rt = merge(merge(x, z), y);
}
int fin(int pos, int k) {
	if(k == siz[ch[pos][0]] + 1)return val[pos];
	if(k <= siz[ch[pos][0]])fin(ch[pos][0], k);
	else fin(ch[pos][1], k - siz[ch[pos][0]] - 1);
}
int ran(int k) {
	int x, y, res;
	split(rt, k - 1, x, y);
	res = siz[x] + 1, rt = merge(x, y);
	return res;
}
int pre(int k) {
	int x, y, res;
	split(rt, k - 1, x, y);
	res = fin(x, siz[x]), rt = merge(x, y);
	return res;
}
int suc(int k) {
	int x, y, res;
	split(rt, k, x, y);
	res = fin(y, 1), rt = merge(x, y);
	return res;
}
signed main() {
	srand(time(0));
	while(n--) {
		int op = read(), v = read();
		if(op == 1)ins(v);
		else if(op == 2)del(v);
		else if(op == 3)write(ran(v)), putchar('\n');
		else if(op == 4)write(fin(rt, v)), putchar('\n');
		else if(op == 5)write(pre(v)), putchar('\n');	
		else write(suc(v)), putchar('\n');
	}
	return 0;
} 
2024/7/26 08:51
加载中...