链接: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. Eclipse错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    该报错是由于缺少servlet-api.jar造成的,将servlet-api.jar复制到项目下的WEB-INF/lib目录下即可 servlet-api.jar在tomcat的lib目录下有,可以 ...

  2. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  3. day27 网络通信协议 tcp/udp区别

    今日主要内容: 一.网络通信协议 二.tcp udp协议下的socket 一.网络通信协议 1.1互联网的本质就是一系列的网络协议 本机IP地址('127.0.0.1',xxxx) 互联网连接的电脑互 ...

  4. caffe,Inception v2 Check failed: top_shape[j] == bottom[i]->shape(j)

    使用Caffe 跑 Google 的Inception V2 对输入图片的shape有要求,某些shape输进去可能会报错. Inception model中有从conv和pooling层concat ...

  5. javascript进阶笔记(3)

    本篇文章我们来学习和讨论一下js中的闭包.闭包是纯函数式编程的一个特性,因为它们能够大大简化复杂的操作.在js中,闭包的重要性不言而喻! 简单的说,闭包(closure)是 一个函数在创建时 允许 该 ...

  6. [Leetcode 739]*还有几天会升温 Daily Temperatures

    [题目] Given a list of daily temperatures T, return a list such that, for each day in the input, tells ...

  7. Java语法基础学习DaySeven

    ---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean          byte——Byte ...

  8. NuGet 程序源包

    https://api.nuget.org/v3/index.json  (2018-4-24 10:20:07-最新测试,可以用) https://nuget.cnblogs.com/v3/inde ...

  9. SQL--数据--基本操作

    数据操作 新增数据 有两种方案方案1:给全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致:凡是非数值数据,都需要使用引号(建议是单引号)包裹 insert ...

  10. oracle语句优化

    摘录来自https://blog.csdn.net/sap_jack/article/details/3766703 1.选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基 ...