题目:https://codeforces.com/gym/102222/problem/A

Maximum Element In A Stack

time limit per test

10.0 s

memory limit per test

256 MB

input

standard input

output

standard output

As an ACM-ICPC newbie, Aishah is learning data structures in computer science. She has already known that a stack, as a data structure, can serve as a collection of elements with two operations:

  • push, which inserts an element to the collection, and
  • pop, which deletes the most recently inserted element that has not yet deleted.

Now, Aishah hopes a more intelligent stack which can display the maximum element in the stack dynamically. Please write a program to help her accomplish this goal and go through a test with several operations.

Aishah assumes that the stack is empty at first. Your program will output the maximum element in the stack after each operation. If at some point the stack is empty, the output should be zero.

Input

The input contains several test cases, and the first line is a positive integer T

indicating the number of test cases which is up to 50

.

To avoid unconcerned time consuming in reading data, each test case is described by seven integers n (1≤n≤5×106)

, p, q, m (1≤p,q,m≤109), SA, SB and SC (104≤SA,SB,SC≤106). The integer n

is the number of operations, and your program is asked to generate all operations by using the following code in C++.

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(" for(int i = 1; i <= n; i++){ if(rng61() PUSH(rng61() else POP(); } }

The procedure PUSH(v) used in the code inserts a new element with value v

into the stack and the procedure POP() pops the topmost element in the stack or does nothing if the stack is empty.

Output

For each test case, output a line containing Case #x: y, where x is the test case number starting from 1

, and y is equal to ⊕i=1n(i⋅ai) where ⊕

means bitwise xor.

Example
Input

Copy
2
4 1 1 4 23333 66666 233333
4 2 1 4 23333 66666 233333
Output

Copy
Case #1: 19
Case #2: 1
Note

The first test case in the sample input has 4

operations:

  • POP();
  • POP();
  • PUSH(1);
  • PUSH(4).

The second test case also has 4

operations:

  • PUSH(2);
  • POP();
  • PUSH(1);
  • POP().

题意:

给你一个栈和一个叫rng61的算法,当符合条件就加入一些内容到栈中,并在每次操作后记录当前栈中最大值ai,最后输出答案1到n的异或和i*ai

思路:

rng61是优化不了了,但我们可以在找栈中最大值时优化,如果是要询问栈中最大值,那么如果当前加入的元素小于以前记录的最大值,那么这个信息是没有记录的必要的,
所以可以用一个单调不减的单调栈存每个状态的最大值,另一个普通栈存操作的原始序列,如果要往普通栈中推入元素,则如果这个元素大于等于单调栈的栈顶则加入单调栈,
如果在普通栈进行pop操作,则看当前pop的元素是否>=单调栈的栈顶,如果是就把单调栈的栈顶pop(因为我们在单调栈中存的是单调不减的元素,所以如果碰到普通栈pop的元素大于等于单调栈栈顶元素,则这个元素必定是加入过单调栈的),
如果普通栈为空或单调栈为空,则清空单调栈并向单调栈中推入一个0元素
然后每次操作的普通栈中的最大值就是单调栈的栈顶

注意:

1.栈不为空时才能进行pop操作(如果是数组模拟则tp--后如果tp<0则需要让tp=0)

2.ans要用long long存,这次比赛是算法是写正确了,但实现时用了unsigned int,一直卡在最后的数据,以后像ans,求和,求积之类的果断用long long来存(防溢出用long long)

 #include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,p,q,m;bool adf;
long long ans;
unsigned int SA,SB,SC;
long long last,sttp,dsttp;
stack<long long> st,dst;
unsigned int rng61(){
SA^=SA<<;
SA^=SA>>;
SA^=SA<<;
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);
while(st.size())st.pop();while(dst.size())dst.pop();
ans=;
for(unsigned int i=;i<=n;i++){
adf=;
if(dst.empty())dst.push();
if(rng61()%(p+q)<p)st.push(rng61()%m+);
else if(st.size()) last=st.top(),st.pop(),adf=;
if(st.empty()){
ans^=i*;
while(dst.size())dst.pop();
dst.push();
}
else {
sttp=st.top(),dsttp=dst.top();
if(adf){
if(sttp>=dsttp)dst.push(sttp);
}
else {
if(last>=dsttp&&dst.size())dst.pop();
}
if(dst.empty())dst.push();
ans^=i*dst.top();
}
}
}
int main(){
int T,cas=;
scanf("%d",&T);
while(T--){
gen();
printf("Case #%d: %lld\n",cas++,ans);
}
}
/**
给你一个栈和一个叫rng61的算法,当符合条件就加入一些内容到栈中,并在每次操作后记录当前栈中最大值ai,最后输出答案1到n的异或和i*ai
rng61是优化不了了,但我们可以在找栈中最大值时优化,如果是要询问栈中最大值,那么如果当前加入的元素小于以前记录的最大值,那么这个信息是没有记录的必要的,
所以可以用一个单调不减的单调栈存每个状态的最大值,另一个普通栈存操作的原始序列,如果要往普通栈中推入元素,则如果这个元素大于等于单调栈的栈顶则加入单调栈,
如果在普通栈进行pop操作,则看当前pop的元素是否>=单调栈的栈顶,如果是就把单调栈的栈顶pop(因为我们在单调栈中存的是单调不减的元素,所以如果碰到普通栈pop的元素大于等于单调栈栈顶元素,则这个元素必定是加入过单调栈的),
如果普通栈为空或单调栈为空,则清空单调栈并向单调栈中推入一个0元素
然后每次操作的普通栈中的最大值就是单调栈的栈顶
注意栈不为空时才能进行pop操作(如果是数组模拟则tp--后如果tp<0则需要让tp=0),ans要用long long存,这次比赛是算法是写正确了,但实现时用了unsigned int,一直卡在最后的数据,以后像ans,求和,求积之类的果断用long long来存
**/

题外话:2019银川网络赛竟然用原题,变成了大学生程序重构大赛,比搜索比手速,前有tourist5小时AKWF,今有北师大6分钟AK网络赛(写完C后被队友告知北师大已经只差1题就AK了)

[单调栈] 2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest-Maximum Element In A Stack的更多相关文章

  1. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Maximum Element In A Stack

    //利用二维数组模拟 #include <iostream> #include <cstdio> #include <cstring> #include <s ...

  2. 2018浙江省赛(ACM) The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

    我是铁牌选手 这次比赛非常得爆炸,可以说体验极差,是这辈子自己最脑残的事情之一. 天时,地利,人和一样没有,而且自己早早地就想好了甩锅的套路. 按理说不开K就不会这么惨了啊,而且自己也是毒,不知道段错 ...

  3. HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019

    今日这场比赛我们准备的题比较全面,二分+数论+最短路+计算几何+dp+思维+签到题等.有较难的防AK题,也有简单的签到题.为大家准备了一份题解和AC代码. A - Meeting with Alien ...

  4. HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019

    赛后总结: T:今天下午参加了答辩比赛,没有给予队友很大的帮助.远程做题的时候发现队友在H上遇到了挫折,然后我就和她们说我看H吧,她们就开始做了另外两道题.今天一人一道题.最后我们在研究一道dp的时候 ...

  5. The 10th Shandong Provincial Collegiate Programming Contest 2019山东省赛游记+解题报告

    比赛结束了几天...这篇博客其实比完就想写了...但是想等补完可做题顺便po上题解... 5.10晚的动车到了济南,没带外套有点凉.酒店还不错. 5.11早上去报道,济南大学好大啊...感觉走了一个世 ...

  6. ACM ICPC China final G Pandaria

    目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...

  7. ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbilisi, November 24, 2010

    ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbil ...

  8. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  9. 2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定理

    2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定 ...

  10. 2020 ICPC Universidad Nacional de Colombia Programming Contest

    2020 ICPC Universidad Nacional de Colombia Programming Contest A. Approach 三分 显然答案可以三分,注意\(eps\)还有两条 ...

随机推荐

  1. 使用 javascript 配置 nginx

    在上个月的 nginx.conf 2015 大会上, 官方宣布已经支持通过 javascript 代码来配置 nginx,并把这个实现称命名为--nginscript.使用 nginscript,可以 ...

  2. Gradle的依赖方式——Lombok在Gradle中的正确配置姿势

    写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.p ...

  3. 迈克尔·乔丹:几百年内AI不会觉醒

    ​​ 此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...

  4. iPhone7产业链不为人知的辛酸

    ​苹果金秋新品发布会是科技界的"春晚",年复一年地重复,难免会让人产生审美疲劳,但每逢中国教师节前后,全球的科技人士和媒体还是会不约而同地走到一起,等待苹果团队为之奉献出好的产品和 ...

  5. java反序列化-ysoserial-调试分析总结篇(4)

    1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ...

  6. 【DirectX 11学习笔记】世界矩阵的理解-运动合成

    最近在看龙书,写一下自己的学习理解,主要是物体运动的合成. 物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵A,并通过世界矩阵变换到唯一的世界坐标系. 物体在某时刻发生了位移和旋 ...

  7. 面向web前端及node开发人员的vim配置

    鉴于 window 下基本用不到 vim,所以下面内容不再提及 window,具体可以在相应 github 中查看手册操作基础:已装有上有 nodejs(npm).没装的可以移步官网:https:// ...

  8. 「ReStory」在 Markdown 中自由书写 React 组件 (Beta)

    介绍 先睹为快 我们在开发一个小小的 React 组件库,但是我们遇到了一个大难题,那就是为我们的组件库书写一个合理的文档. 作为组件文档,我们非常希望我们的组件用例代码能够展现出来,是的我们在书写文 ...

  9. Vue请求第三方接口跨域最终解决办法!2020最终版!

    废话少说,再百度的近三个小时尝试了近10种方法无解后,终于皇天不负有心人! 这个vue axios 跨域问题被我解决了! 需求:请求客户端ip地址获取客户ip,再根据ip获取用户位置 工具:Vue,a ...

  10. 【转】Maven详细

    Maven maven 中央仓库 网站 https://mvnrepository.com/ 全世界 发布到Maven仓库 供用类着使用 maven 本质上下载工具和构建工具 下载工具 迅雷 只能下载 ...