题目链接:https://ac.nowcoder.com/acm/contest/19850/L
HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁。
该指纹锁的加密算法会把一个指纹转化为一个不超过1e7的数字,两个指纹数值之差越小,就说明两个指纹越相似,当两个指纹的数值差≤k时,这两个指纹的持有者会被系统判定为同一个人。
现在有3种 *** 作,共m个,
*** 作1:add x,表示为指纹锁录入一个指纹,该指纹对应的数字为x,如果系统内有一个与x相差≤k的指纹,则系统会忽略这次添加 *** 作
*** 作2:del x,表示删除指纹锁中的指纹x,若指纹锁中多个与x相差≤k的指纹,则全部删除,若指纹锁中没有指纹x,则可以忽略该 *** 作,
*** 作3:query x,表示有一个持有指纹x的人试图打开指纹锁,你需要设计一个判断程序,返回该人是否可以打开指纹锁(只要x与存入的任何一个指纹相差≤k即可打开锁)。
初始状态,指纹锁中没有任何指纹。**:
Input
第一行有2个正整数m,k。
接下来m行,每行描述一种 *** 作:add x,del x或query x。
Output
对于每个query *** 作,输出一行,包含一个单词“Yes”或“No”,表示该人是否可以打开指纹锁。
Example Input4 3
add 1
add 10
query 5
query 4
Example Output
No
Yes
#解析 :
红黑树set,升序无重复元素,每种 *** 作复杂度都是logn的。总复杂度nlogn
AC代码 - - -
#solution1
#include
using namespace std;
typedef long long ll;
set<ll> q;
inline ll inll()
{
ll x = 0, f = 1;char c = getchar();
while(c<48||c>57) {
if(c=='-') f = -1;
c = getchar();
}
while(c>=48&&c<=57) {
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
return x*f;
}
inline string ins() {
char c = getchar();
string s = "";
while(c<'a'||c>'z') c = getchar();
while(c>='a'&&c<='z') {
s += c;
c = getchar();
}
return s;
}
/*输入
inll(),输入ll
ins(),输入string
*/
int main() {
ll m = inll(), k = inll(), t;
string s;
for(int i = 0; i < m; ++i) {
s = ins();
t = inll();
if(s[0]=='a') {
if(q.upper_bound(t-k-1)==q.upper_bound(t+k)) q.insert(t);
}else if(s[0]=='d') {
if(q.size()>0) {
q.erase(q.upper_bound(t-k-1),q.upper_bound(t+k));
}
}else {
if(q.upper_bound(t-k-1)==q.upper_bound(t+k))
printf("No\n");
else
printf("Yes\n");
}
}
return 0;
}
#solution2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)