(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
Catalog
Problem:Portal传送门
原题目描述在最下面。
题意不想过多描述,内心十分不平静。
Solution:
简单就是可以找到一个规律就是很多次求和后到最后一个0哪里的值一定是1(除非这是最后一个0且只有一个0).问题转换为求最后一个0后面1的数量。
组队训练赛写这题自闭了一下午!一下午都读错题了!赛后听别人讲后发现和我做的不是一道题我去???wtm?我听队友的题意是求和时要把栈首元素放到栈底求和,因为题目有一句话叫:
Take the element from top to bottom,
反正我是不知道为什么犯这错误。。。以后一定要自己把题意确定一遍!!!
啊,难受啊马飞!
AC_Code:
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
const int N = 500005;
int n,m;
int stak[N], top, zero[N];
int lst[3], fir[3];
int main(){
int tim, tc = 0;
scanf("%d", &tim);
while(tim--){
scanf("%d",&n);
mem(fir,-1);mem(lst,-1);
char s[10];
int u, flag = 1, st = 210002,ed = 210001;
int a = 210002, b = 210001;
printf("Case #%d:\n", ++tc);
for(int i = 1; i <= n; ++i){
scanf("%s", s);
if(s[0]=='P'){
if(s[1]=='U'){
scanf("%d", &u);
if(flag){
stak[++ed] = u;
lst[u] = ed;
if(fir[u] == -1)fir[u]=ed;
if(u == 0)zero[++b] = ed;
}else{
stak[--st] = u;
fir[u] = st;
if(lst[u] == -1)lst[u] = st;
if(u == 0)zero[--a] = st;
}
}else{
if(st > ed)continue;
if(flag){
u = stak[ed];--ed;
if(u == 1)continue;
if(a >= b)lst[u] = fir[u] = -1;
else lst[u]=zero[b-1];
if(a<=b)--b;
}else{
u = stak[st];++st;
if(u == 1)continue;
if(a >= b)fir[u] = lst[u] = -1;
else fir[u] = zero[a+1];
if(a<=b)++a;
}
}
}else if(s[0]=='Q'){
if(st > ed){
printf("Invalid.\n");
continue;
}else if(st == ed){
printf("%d\n", stak[st]);
continue;
}
if(flag){
int tmp = fir[0]-st+1;
if(fir[0] == ed)tmp = fir[0]-st;
if(fir[0] == -1) tmp = ed - st + 1;
if(tmp%2 == 1)printf("1\n");
else printf("0\n");
}else{
int tmp = ed - lst[0] + 1;
if(lst[0] == st)tmp = ed - lst[0];
if(lst[0] == -1)tmp = ed - st + 1;
if(tmp % 2 == 1)printf("1\n");
else printf("0\n");
}
}else flag = !flag;
}
}
return 0;
}