1. 程式人生 > >牛客小白月賽6

牛客小白月賽6

 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

示例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

備註:

對於100%的測試資料:
1 ≤ k,m ≤ 1000000
資料量較大,注意使用更快的輸入輸出方式。

思路:直接上set,對自動排序處理一下即可.......唉。

程式碼如下:

#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>s;
int main()
{
    scanf("%d%d",&m,&k);
    int x;
    char op[8];
    while(m--)
    {
        scanf("%s%d",op,&x);
        if(op[0]=='a')
        {
            if(s.find(x)==s.end())
            {
                s.insert(x);
            }
        }
        else if(op[0]=='d')
        {
            s.erase(x);
        }
        else
        {
            if(s.find(x)!=s.end()) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}