1. 程式人生 > >牛客G-指紋鎖【一題三解】

牛客G-指紋鎖【一題三解】

str ret puts () 題目 del ont 操作 urn

鏈接: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,則可以忽略該操作,
操作3:query x,表示有一個持有指紋x的人試圖打開指紋鎖,你需要設計一個判斷程序,返回該人是否可以打開指紋鎖(只要x與存入的任何一個指紋相差≤k即可打開鎖)。
初始狀態,指紋鎖中沒有任何指紋。

輸入描述:

第一行有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-指紋鎖【一題三解】