链接: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. python(3)之字符串

    字符串常用操作如下: name="huang yuqing"print(name.count("h"))#计算包含字符的个数print(name.capital ...

  2. linux git:fatal: HTTP request failed

    问题 问题的出现比较奇怪 我一台电脑 git clone   没问题 另外一台电脑  git  clone  有问题 解决 yum update nss nss-util nspr 参考 https: ...

  3. Node.js是用来干嘛的

    如果你去年注意过技术方面的新闻,我敢说你至少看到node.js不下一两次.那么问题来了“node.js是什么?”.有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东西”.如果 ...

  4. ASCII编码、Unicode编码、UTF-8

    一.区别 ASCII.Unicode 是“字符集” UTF-8 .UTF-16.UTF-32  是“编码规则” 其中: 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code ...

  5. win10与centos7的双系统U盘安装(二:安装以及配置centos系统)

    继续第一篇的讲解,接着就是要进入第二部分——安装以及配置centos系统 特别提醒在安装centos之间,注意自己的win10系统进行备份,便于回复安装失败后的系统 1:安装前准备 安装前准备主要是两 ...

  6. Java日期时间,以及相互转换

    Java日期时间,以及相互转化 package com.study.string; import java.text.ParseException; import java.text.SimpleDa ...

  7. 读书笔记 C# 接口中的索引器之浅析

    在C#中,可以在类.结构或接口中用this关键字声明索引器,在索引器内部用get或set访问器访问类中集合的某项值.因此可以将索引器看作是类的属性一样去定义.索引器常用定义格式如下: public i ...

  8. 国内npm镜像使用

    淘宝npm镜像 搜索地址:http://npm.taobao.org/ registry地址:http://registry.npm.taobao.org/ cnpmjs镜像 搜索地址:http:// ...

  9. 从原理上理解如何由震源机制一个节面的解:strike,dip,rake可以求出另一个节面的解

    首先,需要回到最原始的地震矩的表达式: 已知strike,dip,rake 根据strike和dip可以求出v,根据strike,dip,rake,可以求出u. 把求出来的v和u互换,相当于原来的位错 ...

  10. maven包上传私服

    选择需要上传的项目右键-->Run As-->Run Configurations-->Maven Buid-->右键 new -->选择 base directory- ...