题目大意
有一个集合,这个集合是一个互异的集合并且集合支持以下几种操作:
操作1 插入一个数x:向集合中插入元素x(保证不会插入集合中现有的数据)
操作2 删除一个数x:从集合中删除元素x
操作3 询问x:返回集合内第一个不小于x的数
输入
第一行:一个输入为n,表示接下来操作的次数(n<=10000)
接下来n行:每行两个输入 op x,op表示操作种类,x表示插入/删除/询问的数字(1<=op<=3,-1000<=x<=1000)
输出
进行操作1时,不做任何输出操作
进行操作2时,如果删除操作成功,输出“delete”。如果删除操作失败,输出“none”。
进行操作3时,输出集合内第一个不小于x的数。果没有满足条件的数,输出“null”。如果集合为空,输出“empty”。
主要思路
map+模拟
时间复杂度(预期):n * logn
代码
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<int,int> asd;
map<int,int>::iterator lower;
typedef map<int,int>::iterator prefix;
int n;
inline int getint()
{
int flag=1;
int res=0;
char c;
c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
res=res*10+c-'0';
c=getchar();
}
return res*flag;
}
void push(int i)
{
int t=getint();
asd.insert(pair<int,int>(t,i));
}
void delete_()
{
int t=getint();
prefix it=asd.find(t);
if(it!=asd.end())
{
asd.erase(it);
printf("delete\n");
}
else
printf("none\n");
}
void query()
{
int t=getint();
if(asd.size()==0)
{
printf("empty\n");
return ;
}
lower=asd.lower_bound(t);
if(lower!=asd.end())
printf("%d\n",lower->first);
else
printf("null\n");
}
int main()
{
int flag;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
flag=getint();
if(flag==1)
push(flag);
else if(flag==2)
delete_();
else if(flag==3)
query();
}
return 0;
}