链接: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. [转]一次CMS GC问题排查过程(理解原理+读懂GC日志)

    这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...

  2. Ubuntu下环境变量的设置

    远程登录时,不是ssh登陆:  xrdp 可以修改并添加 /etc/xrdp/startwm.sh 代码: #!/bin/sh if [ -r /etc/default/locale ]; then  ...

  3. Win10系列:UWP界面布局基础3

    在实际项目开发中,为控件属性赋值时经常会遇到属性值在设计时处于未知状态,而只有在应用程序运行时才能获取到.这种情况下,直接赋值方法是无法满足的,可以使用XAML标记扩展(Markup Extensio ...

  4. Linux的安装包命令/yum 与 Rpm

    1.Rpm安装包命令(以dhcp软件包为例)----Rpm安装软件包需要解决依赖性,因此特别麻烦(如图2被需要). rpm与yum安装的均为二进制软件包.类似于windows下载的软件包,可直接安装使 ...

  5. 调用zabbix 分组api

    调用zabbix 分组api,获取分组中主机host信息,并分类保存, #!/usr/bin/env python #coding:utf8 import requests import json i ...

  6. OOP⑵

    1.问题? 怎么创建对象? 类名 对象名=new 类名(); 在java中只要是看到了()! 这就是方法! 2.构造方法: 创建某个对象的方法! Student stu=new Student(); ...

  7. 【原创】<Debug> QString

    [问题1] 'class QString' has no member named 'toAscii' [解答] 把toAscii().data()改成toLatin1().data() 如果QStr ...

  8. day29 socketsever ftp功能简单讲解

    今日所学 一.ftp上传简单实例 二.socketsever的固定用法 三.验证合法性连接 1.ftp上传实例 这个题目是我们现在网络编程比较基础一点的题目 下面我们只写简单上传的代码 上传服务端的代 ...

  9. angular4-事件绑定

    事件绑定语法(可以通过 (事件名) 的语法,实现事件绑定) <date-picker (dateChanged)="statement()"></date-pic ...

  10. 安装babel

    http://jamesknelson.com/using-es6-in-the-browser-with-babel-6-and-webpack/