链接: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[]; int x;
for (int i = ; i <= n; i++) {
scanf (" %s %d", str, &x);
if (str[] == 'a') {
it = e.lower_bound(x - k);
if (it == e.end() || x + k < *it)
e.insert(x);
}
else if (str[] == '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 ;
}
法二: 动态线段树超时(95%通过率)
#include <bits/stdc++.h>
using namespace std;
#define ln t[rt].lson
#define rn t[rt].rson
#define ls l,m,ln
#define rs m+1,r,rn
const int N = 1e6 + ;
const int M = 1e7 + ;
struct node {
int sum;
int lson, rson;
int tag;
};
node t[N * ]; int cnt;
int n, k;
inline void newnode (int &rt) {
rt = ++cnt;
t[rt].sum = t[rt].tag = ;
ln = rn = -;
}
inline void pushup (int rt) {
t[rt].sum = t[ln].sum + t[rn].sum;
}
void pushdown (int rt) {
if (t[rt].tag) {
t[ln].tag = t[rn].tag = ;
t[ln].sum = t[rn].sum = ;
t[rt].tag = ;
}
}
void update (int L, int R, int x, int l, int r, int rt ) {
if (l > R || r < L) return ;
if (l >= L && r <= R) {
t[rt].sum = x;
t[rt].tag = (x + ) % ;
return ;
}
if (ln < ) {
newnode(ln);
newnode(rn);
}
pushdown(rt);
int m = (l + r) / ;
update (L, R, x, ls);
update (L, R, x, rs);
pushup(rt);
return ;
}
bool query (int L, int R, int l, int r, int rt) {
if (t[rt].sum == || l > R || r < L) return ;
if (l >= L && r <= R) return t[rt].sum > ;
if (ln < ) {
newnode(ln);
newnode(rn);
}
pushdown(rt);
int m = (l + r) / ;
return query(L, R, ls) || query(L, R, rs); }
int main ()
{
scanf ("%d %d", &n, &k) ;
char str[]; int x;
int rt; newnode (rt);
for (int i = ; i <= n; i++) {
scanf (" %s %d", str, &x);
x += M;
int t1 = max (, x - k);
int t2 = min (x + k, * M);
if (str[] == 'a') {
if ( !query (t1, t2, , * M, ) )
update (x, x, , , * M, );
}
else if (str[] == 'q') {
if ( query (t1, t2, , * M, ) ) puts("Yes");
else puts("No");
}
else update (t1, t2, , , * M, );
}
return ;
}

法三:因为连续k个元素且(x/k)值相同的数同一时间只存在一个。。。

#include <bits/stdc++.h>
using namespace std;
const int N=1e7+;
int isok[*N];
int n,k;
bool ask (int x) {
int t=x/k;
if (isok[t]) return ;
if (isok[t-]&&abs(x-isok[t-])<=k) return ;
if (isok[t+]&&abs(x-isok[t+])<=k) return ;
return ;
}
int main ()
{
scanf ("%d %d",&n,&k);
char str[]; int x;
for (int i=;i<=n;i++) {
scanf (" %s %d",str,&x);
x+=N;
if (str[]=='a') {
if (!ask(x)) isok[x/k]=x;
}
else if (str[]=='q') {
if (ask(x)) puts("Yes");
else puts("No");
}
else {
int t=x/k;
if (isok[t]) isok[t]=;
if (isok[t-]&&abs(x-isok[t-])<=k) isok[t-]=;
if (isok[t+]&&abs(x-isok[t+])<=k) isok[t+]=;
}
}
return ;
}

牛客G-指纹锁【一题三解】的更多相关文章

  1. 牛客小白月赛6 G 指纹锁 set的自动排序 模板

    链接:https://www.nowcoder.com/acm/contest/136/G来源:牛客网 题目描述     HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁.   ...

  2. 牛客小白赛1 F题三视图

    链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网 题目描述 Etéreo 拿出家里的许多的立方体积木,堆成了一个三维空间中的模型.既然你高考选了技术 ...

  3. 牛客集训 湖南省赛E题 Grid 动态开点线段树

    国庆牛客集训的题,正好准备好好训练线段树,想起来就补一下. 题意很简单,两种操作行合并或者列合并,每个操作后计算有多少个子块. 这题应该先推导公式,行操作或者列操作只有一种的时候,很简单,总数就是n* ...

  4. 牛客网第一场E题 Removal

    链接:https://www.nowcoder.com/acm/contest/139/E 来源:牛客网 Bobo has a sequence of integers s1, s2, ..., sn ...

  5. 牛客小白月赛6 水题 求n!在m进制下末尾0的个数 数论

    链接:https://www.nowcoder.com/acm/contest/135/C来源:牛客网 题目描述 其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其 ...

  6. 牛客网2018暑期训练 第三场 a题

    #include <bits/stdc++.h> using namespace std; vector<int> path; ; short dp[maxn][maxn][m ...

  7. 【sql】牛客网练习题 (共 61 题)

    [1]查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` ) NOT NULL, `birth_date` date NOT NULL, `first_ ...

  8. 牛客网多校训练第三场 C - Shuffle Cards(Splay / rope)

    链接: https://www.nowcoder.com/acm/contest/141/C 题意: 给出一个n个元素的序列(1,2,...,n)和m个操作(1≤n,m≤1e5),每个操作给出两个数p ...

  9. 牛客网多校训练第三场 A - PACM Team(01背包变形 + 记录方案)

    链接: https://www.nowcoder.com/acm/contest/141/A 题意: 有n(1≤n≤36)个物品,每个物品有四种代价pi,ai,ci,mi,价值为gi(0≤pi,ai, ...

随机推荐

  1. qq远程连接/windows远程桌面/teamviwer/xmanager/vnc的区别

    软件 客户端运行平台 服务端运行平台 服务端是否需要同子网或公网IP 网络断开当前执行命令是否会中止 评价 QQ远程连接 windows windows 否 否 感觉用了一两分钟就动不了了 windo ...

  2. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  3. python图片识别

    python 图像处理模块1. 安装 pytesseract模块是会自动安装Pillow模块.pillow 为标准图像处理库 手册地址 http://pillow-cn.readthedocs.io/ ...

  4. -L、-rpath和-rpath-link的区别

    链接器ld的选项有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是这个意思: -L::  “链接”的时候去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L ...

  5. POJ 2243 Knight Moves(BFS)

    POJ 2243 Knight Moves A friend of you is doing research on the Traveling Knight Problem (TKP) where ...

  6. NTT模板(无讲解)

    #include<bits/stdc++.h>//只是在虚数部分改了一下 using namespace std; typedef long long int ll; ; ; ; ; ll ...

  7. MATLAB图片折腾1

    MATLAB 把文件夹里图片转成mat文件 pt='/Users/haoyuguo/Desktop/sync1/'; ext='*.jpg'; dis=dir([pt ext]); nms={dis. ...

  8. 初始JSP

    什么是JSP 1.JSP(Java Server Pages):在HTML中嵌入Java脚本代码 静态内容是JSP页面中的静态文本,其基本是HTML文本,与Java和JSP语法无关. 例子: 运行结果 ...

  9. js正则学习

    一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...

  10. Dll重定向(尚存否?)

    windows核心编程(第五版)的20.6节介绍了Dll重定向. 0x01  Dll重定向简介 产生Dll重定向原因: 应用程序 a.exe 依赖动态链接库 compoent.dll 1.0 版本.但 ...