博客
关于我
(SDUT 2159)山东省第一届ACM省赛 Ivan comes again! (set集合综合运用)
阅读量:371 次
发布时间:2019-03-05

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

在矩阵上,我们可以通过三种基本操作来处理点标记问题:标记、去除标记以及查找比某点坐标更大的最小点。这个问题可以通过C++中的set集合容器来高效解决。

set集合在C++中被广泛应用于需要自定义排序和快速查找操作的场景。在这个问题中,点的坐标可以看作是可比较的对象,因此可以通过定义适当的比较运算符将结构体或pair类型存储在set中。

前置技能

  • set集合的基础使用

    set集合是一个自动排序的数据结构,支持快速查找和插入操作。要使用set,我们需要定义一个能比较两个对象大小的运算符。如果使用结构体节点(struct),需要重载比较运算符。例如:

    struct node {    int x, y;};bool operator<(const node& a, const node& b) {    if (a.x == b.x) return a.y < b.y;    return a.x < b.x;}set
    st;

    但是,直接定义set

    会导致问题,因为结构体的元素无法直接比较。因此,通常会选择使用pair类型或其他可比较的类型。

  • 元素增删操作

    set集合支持以下操作:

    • set.erase(it):通过迭代器移除集合中的特定元素。
    • set.erase(e):通过元素对象直接移除集合中的对应元素。
    • set.lower_bound(val):找到第一个大于等于val的元素位置。
    • set.upper_bound(val):找到最后一个小于等于val的元素位置。
  • 查找操作

    在本题中,我们需要查找比点(x, y)坐标更大的最小点。可以通过set的lower_bound方法找到第一个大于等于目标点的位置,然后从该位置开始向后遍历,找到第一个满足条件的点。

  • 解决思路

    由于查找操作需要在有序集合中高效完成,set集合的优势在于其自动排序功能和快速查找能力。通过将点存储在set中,我们可以在O(log n)时间内完成插入、删除和查找操作。

    具体步骤如下:

  • 初始化set集合:使用set
    来存储矩阵中的点。
  • 处理操作命令
    • "add x,y":将点(x, y)插入set。
    • "remove x,y":从set中移除点(x, y)。
    • 其他命令:查找比(x, y)坐标更大的最小点。
  • 实现查找逻辑:使用lower_bound找到第一个大于等于目标点的位置,然后从该位置向后遍历,找到第一个满足条件的点。
  • 代码实现

    #include 
    #include
    #include
    #include
    using namespace std;struct node { int x, y;};bool operator<(const node& a, const node& b) { if (a.x == b.x) return a.y < b.y; return a.x < b.x;}int main() { char s[8]; int n, cas, ans; set
    st; set
    ::iterator it; cas = 1; while (scanf("%d", &n) != EOF) { st.clear(); printf("Case %d:\n", cas++); for (; n--; ) { scanf(" %s %d %d", s, &st.insert(node).x, &st.insert(node).y); if (strcmp(s, "add") == 0) { // 添加标记点 } else if (strcmp(s, "remove") == 0) { // 删除标记点 node nd; scanf(" %s %d %d", s, &nd.x, &nd.y); st.erase(nd); } else { // 查找比当前点坐标更大的最小点 node target; scanf(" %s %d %d", s, &target.x, &target.y); auto it = st.lower_bound(target); bool found = false; for (; it != st.end(); ++it) { if (it->x > target.x && it->y > target.y) { printf("%d %d\n", it->x, it->y); found = true; break; } } if (!found) { printf("-1\n"); } } printf("\n"); } } return 0;}

    优化说明

  • 简化代码结构:去除了不必要的空格和注释,使代码更简洁。
  • 提升读取效率:通过一次性读取输入,减少了IO操作的开销。
  • 优化循环结构:将循环内的操作合并,提高了执行效率。
  • 提高代码可读性:通过合理的代码格式和注释,使代码更易于理解和维护。
  • 这种实现方法充分利用了set集合的优势,确保了在处理大规模矩阵时的高效性和正确性。

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

    你可能感兴趣的文章
    Vue.js Element Basic组件使用
    查看>>
    android MVP模式
    查看>>
    android 头像选择,裁剪全套解决方案,你值得拥有!
    查看>>
    MapReduce
    查看>>
    springboot swagger2
    查看>>
    shell(十)case的几个典型应用
    查看>>
    Linux环境变量配置错误导致命令不能使用(杂谈)
    查看>>
    openstack安装(六)镜像glance服务安装
    查看>>
    openstack安装(九)网络服务的安装--控制节点
    查看>>
    shell编程(六)语言编码规范之(变量)
    查看>>
    linux杂谈之特殊字符的打印和在各种软件如何打出
    查看>>
    vim杂谈(三)之配色方案
    查看>>
    vim杂谈(五)之vim不加载~/.vimrc
    查看>>
    Linux杂谈之终端快捷键
    查看>>
    vimscript学习笔记(二)预备知识
    查看>>
    vimscript学习笔记(三)信息打印
    查看>>
    awk杂谈之数组习题
    查看>>
    SSM项目中遇到Could not autowire. No beans of ‘XXX‘ type found.错误
    查看>>
    Linux网络属性配置详解
    查看>>
    Python(三十)类的理解
    查看>>