博客
关于我
(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/

    你可能感兴趣的文章
    【Python】(十二)IO 文件处理
    查看>>
    【Oozie】(三)Oozie 使用实战教学,带你快速上手!
    查看>>
    师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
    查看>>
    Java8新特性——并行流与顺序流
    查看>>
    C语言的数值溢出问题(上)
    查看>>
    BottomNavigationView控件item多于3个时文字不显示
    查看>>
    函数指针的典型应用-计算函数的定积分(矩形法思想)
    查看>>
    8051单片机(STC89C52)八个LED灯闪烁
    查看>>
    8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
    查看>>
    用 wxPython 打印你的 App
    查看>>
    vue项目通过vue.config.js配置文件进行proxy反向代理跨域
    查看>>
    Linux下安装MySql过程
    查看>>
    原生vue实现VantUI中IndexBar索引导航栏功能
    查看>>
    android:使用audiotrack 类播放wav文件
    查看>>
    vue通过better-scroll 封装自定义的下拉刷新组件
    查看>>
    android解决:使用多线程和Handler同步更新UI
    查看>>
    vue自定义封装Loading组件
    查看>>
    解决移动端项目中苹果ios和安卓android手机点击输入框网页页面自动放大缩小
    查看>>
    Element UI 中动态路由的分析及实现
    查看>>
    使用springMVC配置视图管理器后找不到指定的页面
    查看>>