[ICPC 2018 宁夏邀请赛] A-Maximum Element In A Stack(思维)
Posted wizarderror
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ICPC 2018 宁夏邀请赛] A-Maximum Element In A Stack(思维)相关的知识,希望对你有一定的参考价值。
前言
辣鸡网络赛,虽然我是个菜鸡,然而好几个队伍十几分钟就AK???我心态那会彻底崩了,后来群里炸了,话题直接上知乎热搜,都是2018ICPC宁夏网络赛原题,这怎么玩,拼手速?还有我竟然签到都做不出来QAQ太菜了
题意
维护一个栈,每次操作之后询问栈里的最大值$x_i$,求$(1*x_1)\wedge (2*x_2)\wedge \cdots \wedge (n*x_n)$的结果
分析
开始写的时候就就正常的维护栈,但是$WA$了,后来找了半天发现我想错了。我让栈顶元素一直为最大值,$PUSH$的时候如果比当前栈顶值小,进栈后就将两者交换,我那会竟然没发现这么做完全破坏了原有的顺序,脑子$WATER$了,然后网上常见的$TLE$是因为直接遍历去找最大值。我们把最开始的想法稍微改一下就可以了,我们仍然使栈顶元素为最大值,对于$PUSH$进去的值$x$,$x$比之前的栈顶值大当然不用管,假如比之前的栈顶值小的话,就只需要把现在栈顶值改为之前的栈顶值就可以了,这样就能保证当前栈顶值一定是栈内的最大元素。
Code(标程)
#include<bits/stdc++.h> using namespace std; const int MAXN=5000005; int stk[MAXN],top,res[MAXN]; int n, p, q, m; unsigned int SA,SB,SC; unsigned int rng61() SA ^= SA << 16; SA ^= SA >> 5; SA ^= SA << 1; unsigned int t = SA; SA = SB; SB = SC; SC ^= t ^ SA; return SC; long long solve() scanf("%d%d%d%d%u%u%u",&n,&p,&q,&m,&SA,&SB,&SC); long long res=(top=0); for(int i=1;i<=n;i++) if(rng61()%(p+q)<p) stk[++top]=rng61()%m+1; stk[top]=max(stk[top],stk[top-1]); else top=max(top-1,0); res^=1LL*i*stk[top]; return res; int main() int T; scanf("%d",&T); for(int ca=1; ca<=T; ca++) printf("Case #%d: %lld\n",ca,solve()); return 0;
以上是关于[ICPC 2018 宁夏邀请赛] A-Maximum Element In A Stack(思维)的主要内容,如果未能解决你的问题,请参考以下文章
2018 ACM-ICPC 宁夏 H.Fight Against Monsters(贪心)
“2018宁夏邀请赛 ” 兼 “The 2019 Asia Yinchuan First Round Online Programming”