2019icpc银川网络赛-A Maximum(思维)

Posted Frank__Chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019icpc银川网络赛-A Maximum(思维)相关的知识,希望对你有一定的参考价值。

题目链接: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;
}

 

以上是关于2019icpc银川网络赛-A Maximum(思维)的主要内容,如果未能解决你的问题,请参考以下文章

2019ICPC银川站 后记

2019 国际大学生程序设计竞赛(ICPC)亚洲区域赛(银川) 7题

2019 国际大学生程序设计竞赛(ICPC)亚洲区域赛(银川) 7题

2019银川网络赛

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(银川),签到题5题

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(银川),签到题5题