洛谷题目:P1165 日志分析 题解(本题简)

介绍:

前言:

本题事经典的数据结构最小栈的题目,简单来说就是模拟一种"先进后出"的仓库,在任意时刻都能快速回答"当前的仓库里最终的集装箱有多重。"

#解题思路步骤:

1、明确问题核心与规则:

1.1、给定了一棵无向树,没个基点代表仓库,边代表它的路径,我们需要设计一个栈结构来模拟集装箱先进后出的出入库,并且能在任意快速获取栈里的最大值。

1.2、肥肠经典的栈动态最值查询题,这个大部分的难点都在于普通栈只能 O(1) 来访问栈顶的元素,无法直接获得全局的最大值。

1.3、如果没次查询都遍历了整个栈找的最大值,对于题目中给的数据会超时,所以小亦用优化方案来实现 O(1) 的查询效率。

2、问题分析及递推思路:

我们无法在不遍历的情况下直接!获取普通栈的最大值,但我们可以通过额外维护一个辅助栈,进行记录每一步入栈的当前最大值,实现出路栈操作的递推变更,这可以避免了重复计算。

3、动态数据结构的设计:

仅需两个核心栈变量就可以完成了所有的操作,不用需要那些什么复杂机构存储鬼东西:

3.1、普通数据栈,存储每个入展的重量,模拟出先进后出的出入库规则。

3.2、最大值辅助栈,每一步都同步记录当前的栈最大值,保证能够查询时可以直接获取栈为全局的最大值。

4、两次栈操作具体递推逻辑:

整个过程中将通过同步维护两栈,保证能够出入库查询操作都均在 O(1) 时间复杂度:

4.1、入栈操作:将重量 X 压入数据栈 st ;若最大值的栈为空或 ,则将 X 压入最大值栈;否则将 max_st.top() 再次压入最大值栈,确保能够两个栈元素个数从头到位都相等,且每一步的栈顶都是当前数据栈的最大值。

4.2、出栈操作:若数据栈不为空,则同时弹出 st 和 max_st 的栈顶元素,保持两个栈的同步;若该仓库为空则直接忽略该操作。

4.3、查询操作:若当前最大值栈为空,那直接输出 0 ;反之就会直接输出 max_st.top(),即为i当前仓库内的最大集装箱的重量。

4.4、筛选最终 result:我们按照日志顺序处理所有操作,遇到查询的操作时咱直接输出结果就可以啦。

##复杂度:

1、时间复杂度:

2、空间复杂度:

###代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    stack<int> st;  
    stack<int> max_st; 
    while (n--)
    {
        int op;
        cin >> op;
        if (op == 0)
        {
            int x;
            cin >> x;
            st.push(x);
            if (max_st.empty() || x >= max_st.top())
                max_st.push(x);
            else
                max_st.push(max_st.top());
        }
        else if (op == 1)
        {
            if (!st.empty())
            {
                st.pop();
                max_st.pop();
            }
        }
        else if (op == 2)
        {
            if (max_st.empty())
                cout << "0\n";
            else
                cout << max_st.top() << "\n";
        }
    }

    
    return 0;
}

--- 感谢观看---

制作:Code.小亦
代码提供:Code.小亦
题目思路部分提供:无

代码部分思路提供:无

知识共享:无

知识查找来源:无

初审:Code.小亦。

终审:Code.小亦。

本文章属于原创作品,禁止任何人进行转载,除合作之外!!

如在阅读中发现知识性错误、代码错误、错别字错误等情况私信博主或评论或通过邮箱2952104443@qq.com。

另:题目来源:首页 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)