NC17508. 指纹锁
描述
输入描述
第一行有2个正整数m,k。
接下来m行,每行描述一种操作:add x,del x或query x。
输出描述
对于每个query操作,输出一行,包含一个单词“Yes”或“No”,表示该人是否可以打开指纹锁。
示例1
输入:
4 3 add 1 add 10 query 5 query 4
输出:
No Yes
示例2
输入:
4 3 add 1 query 4 del 1 query 4
输出:
Yes No
示例3
输入:
6 3 add 10 query 10 add 5 query 5 del 7 //系统将指纹10和指纹5全部删除 query 8
输出:
Yes Yes No
C++(g++ 7.5.0) 解法, 执行用时: 373ms, 内存消耗: 2200K, 提交时间: 2022-08-23 00:14:13
#include<bits/stdc++.h> using namespace std; int m,k; struct cmp{ bool operator()(int a,int b) { if(abs(a-b)<=k) return false; return a>b; } }; set<int,cmp>p; int main() { scanf("%d%d",&m,&k); char s[6]; int n; while(m--) { scanf("%s%d",s,&n); if(s[0]=='a') p.insert(n); else if(s[0]=='d') p.erase(n); else { if(p.find(n)!=p.end()) puts("Yes"); else puts("No"); } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 498ms, 内存消耗: 13944K, 提交时间: 2020-02-28 00:00:16
#include<bits/stdc++.h> using namespace std; int x,m,k; struct node { bool operator()(int a,int b) { if(abs(a-b)<=k) return false; return a<b; } }; int main() { char R[9]; set<int,node>T; scanf("%d%d",&m,&k); while(m--) { scanf("%s%d",&R,&x); if(R[0]=='a'&&T.find(x)==T.end()) T.insert(x); if(R[0]=='d') T.erase(x); if(R[0]=='q') (T.find(x)!=T.end())?printf("Yes\n"):printf("No\n"); } return 0; }
C++14(g++5.4) 解法, 执行用时: 897ms, 内存消耗: 13968K, 提交时间: 2020-10-09 21:53:52
#include<bits/stdc++.h> using namespace std; int x,m,k; string str; struct cmp { bool operator()(int a,int b) { if(abs(a-b)<=k) return false; return a<b; } }; set<int,cmp> T; int main() { cin>>m>>k; while(m--) { cin>>str; scanf("%d",&x); if(str[0]=='a'&&T.find(x)==T.end()) T.insert(x); if(str[0]=='d') T.erase(x); if(str[0]=='q') cout<<(T.find(x)!=T.end() ? "Yes\n":"No\n"); } }