题目链接:https://nanti.jisuanke.com/t/41285
题意:维护一个栈,支持入栈和出栈操作,并计算每次操作后的栈中最大值,得到最终结果。
思路:
外面吵得风生水起,我校平静地在打比赛,丝毫不知道这次比赛的题目就是把2018银川邀请赛的题照搬过来了QAQ,主办方真牛逼。。
这题真的是,我和hxc轮流做这道题,被坑惨了,一直以为使用数据结构来做,没想到点上去。思维题,每次保证栈顶为栈中最大元素。如果当前入栈的元素为x,当前栈顶元素为y,如果x>=y,这个没问题,直接入栈就行了; 如果x<y,我们相当于直接用y替换x,再入栈即可。
吸取教训,这种过的人很多的,不要想复杂,怎么简单怎么来。
AC代码:
#include<cstdio> #include<algorithm> #include<set> #include<map> using namespace std; const int maxn=5e6+5; typedef unsigned int UI; int T,cas,top; UI stk[maxn]; long long ans; 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; } void gen(){ scanf("%d%d%d%d%u%u%u",&n,&p,&q,&m,&SA,&SB,&SC); for(int i=1;i<=n;++i){ if(rng61()%(p+q)<p){ stk[++top]=rng61()%m+1; stk[top]=max(stk[top-1],stk[top]); } else if(top>0) --top; ans^=1LL*i*stk[top]; } } int main(){ scanf("%d",&T); while(T--){ ans=0; top=0; gen(); printf("Case #%d: %lld\n",++cas,ans); } return 0; }
原文地址:https://www.cnblogs.com/FrankChen831X/p/11440426.html
时间: 2024-10-08 16:52:27