链接
\(\text{2019宁夏网络赛-A.Maximum Element In A Stack}\)
题意
给你一个空的\(\text{stack}\),你有两种操作,入栈一个数以及将栈顶数出栈,每次入栈操作后或者出栈操作后,你需要输出当前栈中的最大值,如果栈为空而当前操作为出栈,那么应该输出0。
输入规格即数据范围:第一行一个\(\text{T(T<50)}\),下面每行一组测试样例,包含七个整数\(n(1\leq n \leq 5\times\ 10^{6}),p,q,m(1\leq p,q,m\leq 10^{9}),SA,SB,SC(10^{4}\leq SA,SB,SC\leq 10^{6})\),其中\(n\)是操作的数量,其中关于入栈出栈操作部分代码已给出,如下:
1 | int n, p, q, m; |
对于每个测试样例,输出一行Case #x: y
,x代表第x个测试样例,y等于\(\oplus^n_{i=1} (i \cdot a_i)\),\(a_i\)是第\(i\)次操作后的最大值。
分析
关键目标是求出,每次出栈入栈之后的最大值,如果没有出栈操作,仅仅只有入栈操作,那么我们需要一个res以及一个栈s1,在每次入栈元素x之后,使用它更新一下最大值res,但是这里出现了出栈的操作;
那么考虑一个出栈操作前后的最大值变化,如果出栈元素不是最大值,那么最大值不变,如果出栈元素是最大值,那么出栈后最大值为没出栈前的次大值,那么我们考虑使用一个单调的栈\(s2\)(栈底到栈顶递增)模拟最大值变化,栈\(s1\)模拟入栈出栈操作;如果当前操作是入栈元素\(x\),并且\(x\)大于等于栈顶元素,那么就让\(x\)同时入栈\(s1、s2\),若小于,则让\(x\)入栈\(s1\),如果当前操作是出栈操作,比较\(s1\)栈顶元素与\(s2\)栈顶元素,若相等,说明当前最大元素即为\(s1\)栈顶元素,那么同时让\(s1\)与\(s2\)栈顶元素出栈,不相等则,让\(s1\)栈顶元素出栈,当前最大值即为\(s2\)栈顶元素。
代码
1 |
|