题目描述:
维护一个集合,支持如下几种操作:
- I x ,插入一个数 x;
- Q x ,询问数 x 是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果。
输入格式:
第一行包含整数 N,表示操作数量。
接下来 N 行,每行包含一个操作指令,操作指令为I x ,Q x 中的一种。
输出格式:
对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出Yes,否则输出No。
每个结果占一行。
样例输入:
5 I 1 I 2 I 3 Q 2 Q 5
样例输出:
Yes No
提示:
1≤N≤105
−109≤x≤109
时间限制: 1000ms
空间限制: 256MB
代码如下:
#include <iostream>
#include <string.h>
using namespace std;
const int N=1e5+3;
int a[N],e[N],ne[N],idx;
void insert(int x){
int k=(x%N+N)%N;
e[idx]=x,ne[idx]=a[k],a[k]=idx++;
}
bool que(int x){
int k=(x%N+N)%N;
for(int i=a[k];i!=-1;i=ne[i])
if(e[i]==x){
return 1;
}
return 0;
}
int main(){
int t;
cin>>t;
memset(a,-1,sizeof a);
while(t--){
string op;
int x;
cin>>op>>x;
if(op[0]=='I'){
insert(x);
}else{
if(que(x)){
puts("Yes");
}else{
puts("No");
}
}
}
}