列表

详情


NC205786. 集合操作

描述

    有一个集合S,刚开始是空集,现在有3种操作。
    1.往集合中添加x,如果集合中已经存在x,则不添加。
    2.从集合中删除x,如果集合中不存在x,则不删除。
    3.查询大于等于x且不在集合S中的最小的正整数

输入描述

第一行输入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]));
	}
}

上一题