牛客G-指紋鎖【一題三解】
阿新 • • 發佈:2018-08-20
str ret puts () 題目 del ont 操作 urn
現在有3種操作,共m個,
操作1:add x,表示為指紋鎖錄入一個指紋,該指紋對應的數字為x,如果系統內有一個與x相差≤k的指紋,則系統會忽略這次添加操作
操作2:del x,表示刪除指紋鎖中的指紋x,若指紋鎖中多個與x相差≤k的指紋,則全部刪除,若指紋鎖中沒有指紋x,則可以忽略該操作,
操作3:query x,表示有一個持有指紋x的人試圖打開指紋鎖,你需要設計一個判斷程序,返回該人是否可以打開指紋鎖(只要x與存入的任何一個指紋相差≤k即可打開鎖)。
初始狀態,指紋鎖中沒有任何指紋。
鏈接:https://www.nowcoder.com/acm/contest/136/G
來源:牛客網
題目描述
HA實驗有一套非常嚴密的安全保障體系,在HA實驗基地的大門,有一個指紋鎖。 該指紋鎖的加密算法會把一個指紋轉化為一個不超過1e7的數字,兩個指紋數值之差越小,就說明兩個指紋越相似,當兩個指紋的數值差≤k時,這兩個指紋的持有者會被系統判定為同一個人。現在有3種操作,共m個,
操作1:add x,表示為指紋鎖錄入一個指紋,該指紋對應的數字為x,如果系統內有一個與x相差≤k的指紋,則系統會忽略這次添加操作
操作2:del x,表示刪除指紋鎖中的指紋x,若指紋鎖中多個與x相差≤k的指紋,則全部刪除,若指紋鎖中沒有指紋x,則可以忽略該操作,
初始狀態,指紋鎖中沒有任何指紋。
輸入描述:
第一行有2個正整數m,k。
接下來m行,每行描述一種操作:add x,del x或query x。
輸出描述:
對於每個query操作,輸出一行,包含一個單詞“Yes”或“No”,表示該人是否可以打開指紋鎖。
法一: set集合的運用:重要---erqase 的使用
不知道問什麽c++11超時,c++14就ok了。
#include <bits/stdc++.h> using namespace std; set <int> e; set <int>::iterator it,t; int n, k; int main () { scanf ("%d %d", &n,&k); char str[10]; int x; for (int i = 1; i <= n; i++) { scanf (" %s %d", str, &x); if (str[0] == ‘a‘) { it= e.lower_bound(x - k); if (it == e.end() || x + k < *it) e.insert(x); } else if (str[0] == ‘q‘) { it = e.lower_bound(x - k); if (it == e.end() || x + k < *it) puts("No"); else puts("Yes"); } else { it = e.lower_bound(x - k); t=it; while (it != e.end() && (*it <= x + k)) it++; e.erase(t,it); } } return 0; }
牛客G-指紋鎖【一題三解】