博客
关于我
NC17508 指纹锁
阅读量:652 次
发布时间:2019-03-15

本文共 2193 字,大约阅读时间需要 7 分钟。

问题描述

初始状态下,系统中没有任何数字。系统需要处理三种操作:添加、删除和查询。具体规则如下:

  • 操作1:add x

    添加数字x到系统中。如果系统中已经存在一个与x相差小于等于k的数字,则忽略这次添加操作。

  • 操作2:del x

    删除数字x。如果系统中存在多个与x相差小于等于k的数字,则全部删除。如果没有数字x,忽略该操作。

  • 操作3:query x

    判断是否存在一个数字与x相差小于等于k。


  • 操作实现思路

  • 数据结构选择

    使用标准库set来存储数字。set数据结构可以自动排序,并支持快速查找和插入操作,非常适合这种基于范围查询的场景。

  • 实现细节

    • 添加操作:在插入x前,检查是否存在一个与x相差≤k的数字。如果存在,跳过添加;否则,插入x。
    • 删除操作:找到所有与x相差≤k的数字,并全部删除。如果没有找到x,忽略操作。
    • 查询操作:检查是否存在一个数字与x相差≤k。
  • 性能优化

    使用setlower_bound方法可以快速找到插入位置,确保操作的时间复杂度为O(log n)。这种方法在处理大量操作时表现优异。


  • 参考代码

    #include 
    #include
    using namespace std;set
    aa;int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int m, k; cin >> m >> k; string str; for (int i = 0; i < m; ++i) { cin >> str; if (str[0] == 'a') { int x; cin >> x; if (!aa.empty()) { auto iter = aa.lower_bound(x - k); if (iter != aa.end() && *iter > x + k) { aa.insert(x); } } else { aa.insert(x); } } else if (str[0] == 'd') { int x; cin >> x; auto iter = aa.lower_bound(x - k); set
    bb; while (iter != aa.end() && *iter <= x + k) { bb.push_back(*iter); ++iter; } while (!bb.empty()) { aa.erase(bb.top()); bb.pop(); } } else { int x; cin >> x; if (aa.empty()) { cout << "No" << endl; continue; } auto iter = aa.lower_bound(x - k); if (iter != aa.end() && *iter > x + k) { cout << "Yes" << endl; } else { cout << "No" << endl; } } }}

    代码解释

  • 数据结构

    使用set<int> aa;来存储系统中的所有数字。set的优势在于自动排序和快速查找。

  • 输入处理

    使用ios::sync_with_stdio(false);cin.tie(0);来提高输入输出效率,避免超时。

  • 操作处理

    • 添加操作:检查是否存在相近数字,决定是否插入。lower_bound找到插入位置。
    • 删除操作:找到所有与x相差≤k的数字,存入临时集并删除原集合中的所有这些数字。
    • 查询操作:使用lower_bound查找范围,判断是否存在符合条件的数字。
  • 异常处理

    对于del x操作,若没有找到x,则直接忽略。对于query x,若系统为空则直接返回"No"。


  • 总结

    通过使用set数据结构和lower_bound方法,可以高效地实现操作的逻辑,确保每个操作的时间复杂度为O(log n)。这种方法不仅简洁高效,还能在大规模数据下表现稳定。

    转载地址:http://oyhlz.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>