指纹锁(自定义下比较重载下set的圆括号比较)

时间:2022-07-24
本文章向大家介绍指纹锁(自定义下比较重载下set的圆括号比较),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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即可打开锁)。 初始状态,指纹锁中没有任何指纹。

输入描述: 第一行有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

备注: 对于100%的测试数据: 1 ≤ k,m ≤ 1000000 数据量较大,注意使用更快的输入输出方式。

思路:自定义比较重载下set的圆括号比较,把绝对值在k之间的数定义false,那么erase就可以直接删掉。insert也不会插入。

#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include <bits/stdc++.h>
using namespace std;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
typedef long long ll; typedef unsigned long long ull; typedef long double ld;
const ll MOD = 1e9 + 7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1; for (; isdigit(ch); ch = getchar())    s = (s << 1) + (s << 3) + (ch ^ 48); return s * w; }
inline void write(ll x) { if (!x) { putchar('0'); return; } char F[40]; ll tmp = x > 0 ? x : -x; if (x < 0)putchar('-');    int cnt = 0;    while (tmp > 0) { F[cnt++] = tmp % 10 + '0';        tmp /= 10; }    while (cnt > 0)putchar(F[--cnt]); }
inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
ll qpow(ll a, ll b) { ll ans = 1;    while (b) { if (b & 1)    ans *= a;        b >>= 1;        a *= a; }    return ans; }    ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }
inline int lowbit(int x) { return x & (-x); }
 
int n, k, x;
string s;
struct cmp {
    bool operator() (const int& a, const int& b) const {
        if (abs(a - b) <= k)    return false; //绝对值小于k,删掉
        return a < b; //其余按照小值在前排序
    }
};
 
int main() {
    js;
    cin >> n >> k;
    set<int, cmp> st;
    while (n--) {
        cin >> s >> x;
        if (s[0] == 'a')    st.insert(x);
        else if (s[0] == 'd')    st.erase(x);
        else {
            if (st.find(x) != st.end())    cout << "Yes" << 'n';
            else cout << "No" << 'n';
        }
    }
    return 0;
}