其他分享
首页 > 其他分享> > luogu 题解 P1165 【日志分析】

luogu 题解 P1165 【日志分析】

作者:互联网

做完了题以后,我感触很多。我就发一篇很长【误】但是很容易理解的题解吧!

题目已经告诉我们是先进后出了,很容易想到是栈。(再加上这个标签是数据结构)那我们怎么使用栈呢?

前两项还是蛮简单的

当输入的==0时就再输入一个数,然后栈.push(这个数);

当输入的==1时就栈.pop()

本题的重难点——最大值(用优先队列也可以,不过有些麻烦):

  1. 储存 直接存到栈里有些绕,所以可以另外建一个数组,将这个数存到数组里。然后更新最大值(保证数组为不下降子序列)【当栈空时直接保存】
    cin>>x;
    if(s.size()!=0)
        if(x>a[tot]){
            a[++tot]=x;
        }else {++tot;a[tot]=a[tot-1];
    }
    else a[++tot]=x;
    s.push(x);

    PS:感谢诸位神犇特别是Rain_morning指出了一个至关重要的错误原因

错误原因:

在洛谷编译器中++tot;a[tot]=a[tot-1];和a[++tot]=a[tot-1]不是等价的。

引用世界第一弱dalao的话:“在你的编译器里可能是先计算左边,但在部分评测系统中是先计算右边。”

  1. 输出:输出a[tot]就好了(当栈不为空时)为空时就输出0

  2. 改变:在某个数据弹出栈后,--tot

双手奉上代码:

#include<bits/stdc++.h>
using namespace std;
#define N 200005
stack<int> s;
int maxn,how,n;
int a[N],tot,x;
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>x;
        if(x==0){
            cin>>x;
            if(s.size()!=0)
                if(x>a[tot]){
                    a[++tot]=x;
                }else {++tot;a[tot]=a[tot-1];
                }
            else a[++tot]=x;
            s.push(x);
        }else if(x==1){
                int y=s.top();
                s.pop();
                if(tot>0)
                    --tot;
            }
            else if(x==2){
                if(s.size()!=0)
                    cout<<a[tot]<<endl;
                else cout<<0<<endl;
            }
    }
    return 0;
}
 

标签:++,题解,tot,else,P1165,int,luogu,空时,size
来源: https://www.cnblogs.com/soul-spirit/p/14410510.html