• [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
    ",ca,solve());
        return 0;
    }
    View Code
  • 相关阅读:
    find 指定不删除目录文件
    ORACLE 中 START WITH CONNECT BY PRIOR 用法(用于父子关系的数据表查询)
    ORACLE隔离级别与脏读/不可重复读/幻读的关系以及SELECT FOR UPDATE用法
    ORACLE查询最终阻塞者进程脚本
    01磁盘原理 心得记录
    02RAID技术 学习心得
    04华为HyperReplication中的多时间片技术
    单片机的电源系统
    阴阳论
    03文件系统 学习心得
  • 原文地址:https://www.cnblogs.com/wizarderror/p/11439034.html
Copyright © 2020-2023  润新知