acwing_5722_十滴水

news/2025/1/13 15:52:51 标签: 数据结构, 算法, c++

acwing_5722_十滴水

下面这篇大佬的题解属实是把指针用明白了,可以好好理解一下:

原题解连接:AcWing 5722. 一个简单模拟实现 - AcWing

map/unordered_map的用法:见收藏夹

#include<iostream>
#include<unordered_map>
#include<map>

using namespace std;

//有水的格子
struct Gz {
    int drop;  //水的数量
    Gz *left;  //左边的有水的格子
    Gz *right; //右边的有水的格子
};

int main() {
    int c, m, n;
    cin >> c >> m >> n;
    unordered_map<int, Gz *> mp;    //用来查找每次操作对应编号p的格子的指针
    Gz *l = nullptr;
    int msize = m;                 //目前有水格子数
    int x, w, p;

    //不用unordered_map的原因,给输入的m排序,以使left和right有意义(在csp网站提交的时候一个没过,找了半天才发现m是可以乱序的...)
    map<int, int> mmp;//为什么这里不用数组呢?
    //我的看法是有水的格子相对于所有的格子来说很少,如果将所有的格子都遍历一遍,那么时间复杂度将是不可接受的。

    for (int i = 0; i < m; ++i) {
        cin >> x >> w;
        mmp[x] = w;
    }

    //对着输入存信息
    for (auto i = mmp.begin(); i != mmp.end(); ++i) {
        if (i == mmp.begin()) {
            Gz *t = new Gz;
            mp[i->first] = t;
            t->drop = i->second;
            t->left = l;
            t->right = nullptr;
            l = t;
        } else {
            Gz *t = new Gz;
            mp[i->first] = t;
            t->drop = i->second;
            t->left = l;
            t->right = nullptr;
            l->right = t; //如果格子不是第一个有水的格子,需要多做一步处理
            l = t;
        }
    }

    //对每次操作进行模拟
    for (int i = 0; i < n; ++i) {
        cin >> p;
        Gz *t = mp[p];
        t->drop++;

        //未到4则直接返回目前有水格子数
        if (t->drop <= 4) {
            cout << msize << endl;
        } else {
            while (t) {
                //如果左节点存在则更新左节点
                if (t->left) {
                    t->left->drop++;
                    t->left->right = t->right;
                }
                //如果右节点存在则更新右节点
                if (t->right) {
                    t->right->drop++;
                    t->right->left = t->left;
                }
                msize--;    //删除当前格子

                //如果左节点超过了4,则先跳转到左节点执行操作
                if (t->left && t->left->drop > 4) {
                    t = t->left;
                }
                    //左节点无需操作再检查右结点
                else if (t->right && t->right->drop > 4) {
                    // 注意这里为什么要用else if
                    t = t->right;
                } else {
                    break;
                }
            }
            cout << msize << endl;
        }
    }

    return 0;
}

image-20241205192456444

这份答案只能过8/11,看来还需要完善~


http://www.niftyadmin.cn/n/5822023.html

相关文章

网络安全 | 什么是CC攻击防护?

关注&#xff1a;CodingTechWork CC攻击的介绍 CC攻击&#xff08;Challenge Collapsar Attack&#xff09;是一种针对Web应用程序的攻击方式&#xff0c;通常被称为“网站的拒绝服务攻击”&#xff08;DDoS&#xff09;&#xff0c;主要通过大量伪造的HTTP请求来消耗服务器资…

【LeetCode】力扣刷题热题100道(11-15题)附源码 环形链表 二叉树中序遍历 插入法(C++)

目录 1.字母异位词分组 2.环形链表 3.环形链表2 4.二叉树的中序遍历 5.搜索插入位置 1.字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 排序字符…

晨辉面试抽签和评分管理系统之七:面试成绩核算的三种方式

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

python学opencv|读取图像(三十二)使用cv2.getPerspectiveTransform()函数制作透视图-变形的喵喵

【1】引言 前序已经对图像展开了平移、旋转缩放和倾斜拉伸技巧探索&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十八&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十…

202507读书笔记|《飞花令·河》——微微风簇浪,散做满河星,飞流直下三千尺,疑是银河落九天

202507读书笔记|《飞花令河》——微微风簇浪&#xff0c;散做满河星&#xff0c;飞流直下三千尺&#xff0c;疑是银河落九天 《飞花令河》素心落雪编著&#xff0c;飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c;类似于行酒令&#xff0c;是文人们的…

Vue3 给 reactive 响应式对象赋值

在 Vue 3 中&#xff0c;你可以使用 reactive 函数创建响应式对象。如果你想给这个响应式对象赋值&#xff0c;可以直接修改其属性。以下是一些示例&#xff1a; 直接修改属性 你可以直接通过点符号或方括号语法来修改响应式对象的属性。 import { reactive } from vue;cons…

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下&#xff1a; 传参&#xff1a; 返参&#xff1a; 代码实现&#xff1a; 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…

ROS Action接口

实现自主导航是使用Action接口的主要目的 在实际使用navigation导航系统的时候&#xff0c;机器人需要自主进行导航。不能每次都手动设置导航的目标点。所以需要编写程序代码来实现导航控制。这就需要使用到navigation的导航接口。Navigation的这个导航接口有好几个。Rose官方…