指纹锁

指纹锁,第1张

题意

题目链接: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 Input
4 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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/717132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存