思路
因为每次查询都是找不在集合S中的数,所以不妨逆向思维建立一个集合K,集合K为不在集合S中的所有元素
想到这里如果直接把不在S中的集合全部加到K中那初始时就要加入 1 ~ 1e10 共1e10个元素,那肯定是会超时的
观察一下,每次查找都是找最小的大于x的数并且不在集合S中的,那就是在集合K中的大于元素X的,我们可以离线预处理,先把所有插入删除查找的元素X和X+1都插入集合K,其他的元素在这个数据中无关,就不用都插入到集合K中,查找用二分查找lower_bound就好
代码
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize(2) #pragma GCC optimize(3) typedef long long ll; #define INF 0x3f3f3f3f const int mod = 1e9+7; const int maxn = 1e5+5; #define stop system("pause") inline ll read(){ ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } set<int> s; int op[1000005],x[1000005]; int main(){ int n = read(); for(int i = 0 ; i < n ; ++i){ op[i] = read();x[i] = read(); s.insert(x[i]); s.insert(x[i] + 1); } for(int i = 0 ; i < n ; ++i){ if(op[i] == 1) s.erase(x[i]); else if(op[i] == 2) s.insert(x[i]); else{ auto it = s.lower_bound(x[i]); printf("%d\n",*it); } } return 0; }
私货:比赛的时候没注意给的时间,想了一下只会一种做法不过肯定会超时就溜了,赛后队友才发现这题给了5s