Maximum Element In A Stack Gym

2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest

https://vjudge.net/problem/Gym-102222A

只要按照题目给的步骤进行,而且题目给的代码,不要去去改,否则会错。一开始用一个临时变量去存rng61()的值,但其实不可以。

还有就是,除了题目给的几个数的数据类型不变以外其他的数包括stack都开long long ,否则会错在第2个点。

一个简单的思维,为了保持栈顶的元素始终为最大的元素,在push的时候判断一下,当前的栈顶元素和即将push到栈中的元素的大小,放大的。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n, p, q, m;
 4 unsigned int SA, SB, SC;
 5 stack<long long>sta;
 6 long long maxn(long long a,long long b)
 7 {
 8     if(a>b)
 9         return a;
10     else
11         return b;
12 }
13 unsigned int rng61()
14 {
15     SA ^= SA << 16;
16     SA ^= SA >> 5;
17     SA ^= SA << 1;
18     unsigned int t = SA;
19     SA = SB;
20     SB = SC;
21     SC^=t^SA;
22     return SC;
23 }
24 int main()
25 {
26     int t,cas=0;
27     scanf("%d",&t);
28     while(t--)
29     {
30         scanf("%d%d%d%d%u%u%u",&n,&p,&q,&m,&SA,&SB,&SC);
31         while(!sta.empty())
32             sta.pop();
33         long long ans=0;
34         for(int i=1;i<=n;i++)
35         {
36             if(rng61()%(p+q)<p)
37             {
38                 long long tmp=rng61()%m+1;
39                 if(sta.empty())
40                     sta.push(tmp);
41                 else
42                 {
43                     long long x=sta.top();
44                     sta.push(maxn(tmp,x));
45                 }
46             }
47             else
48             {
49                 if(!sta.empty())
50                     sta.pop();
51             }
52             if(!sta.empty())
53                 ans^=i*sta.top();
54         }
55         printf("Case #%d: %lld
",++cas,ans);
56     }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/1024-xzx/p/12019169.html