我的代码一直 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;
}