luogu 题解 P1165 【日志分析】
作者:互联网
做完了题以后,我感触很多。我就发一篇很长【误】但是很容易理解的题解吧!
题目已经告诉我们是先进后出了,很容易想到是栈。(再加上这个标签是数据结构)那我们怎么使用栈呢?
前两项还是蛮简单的
当输入的==0时就再输入一个数,然后栈.push(这个数);
当输入的==1时就栈.pop()
本题的重难点——最大值(用优先队列也可以,不过有些麻烦):
- 储存 直接存到栈里有些绕,所以可以另外建一个数组,将这个数存到数组里。然后更新最大值(保证数组为不下降子序列)【当栈空时直接保存】
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的话:“在你的编译器里可能是先计算左边,但在部分评测系统中是先计算右边。”
-
输出:输出a[tot]就好了(当栈不为空时)为空时就输出0
-
改变:在某个数据弹出栈后,--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