NC205786. 集合操作
描述
输入描述
第一行输入n,表示有n次操作接下来n行,每行输入两个正整数id和x。id表示执行的操作序号1<=n<=1000000,1<=id<=3,1<=x<=1000 000 000
输出描述
对于每一个操作3,输出一个正整数表示查询到的结果
示例1
输入:
5 1 3 1 5 3 3 3 4 3 5
输出:
4 4 6
C++14(g++5.4) 解法, 执行用时: 3648ms, 内存消耗: 106340K, 提交时间: 2020-07-03 17:16:30
#include<bits/stdc++.h> using namespace std; int x[1001000],y[1001000]; set<int> p; int main() { int t; cin>>t; for(int i=0;i<t;i++) cin>>x[i]>>y[i],p.insert(y[i]),p.insert(y[i]+1); for(int i=0;i<t;i++){ if(x[i]==1) p.erase(y[i]); if(x[i]==2) p.insert(y[i]); if(x[i]==3) cout<<*p.lower_bound(y[i])<<endl; } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4232ms, 内存消耗: 117836K, 提交时间: 2020-06-29 11:35:12
#include<bits/stdc++.h> using namespace std; set<int>T; int id[1000005],x[1000005]; int main() { int i,n; scanf("%d",&n); for(i=0;i<n;i++)scanf("%d%d",&id[i],&x[i]),T.insert(x[i]),T.insert(x[i]+1); for(i=0;i<n;i++) { if(id[i]==1)T.erase(x[i]); else if(id[i]==2)T.insert(x[i]); else printf("%d\n",*T.lower_bound(x[i])); } }