// hdu 5929 Basic Data Structure 模拟
// 题目链接:
// http://acm.hdu.edu.cn/showproblem.php?pid=5929
// 题目大意:
// 有这样一个栈,栈中只放入0或者1,有四种操作
// 1)PUSH 1 or 0
// 2)POP: 弹出栈顶元素
// 3)REVERSE: 将栈中元素逆序
// 4)QUERY: 查询stack[top] nand stack[top-1]... nand stack[0];
// 注:
// 0 nand 0 = 1
// 0 nand 1 = 1
// 1 nand 0 = 1
// 1 nand 1 = 0
// 解题思路:
// 首先注意到有0的时候,结果一定是1,重要性质.我们只要搞定距离栈底的
// 最近的0以及之后1的个数就好
// 其次对于REVERSE,我们可以用一个双端栈,设置一个标量,就可以解决
// 感悟:
// 亮点就是用双端栈的结构了,其次是细节的考虑,还算简单,熟悉栈的操作
// 并不难写.继续奋斗^_^
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 2e5 + 8;
const int ZERO = 2e5; // 矫正0
int pos[MAXN << 1]; // 记录0的位置
int main(){
int t;
//freopen("1.txt","r",stdin);
scanf("%d",&t);
for (int tt = 1; tt <= t; tt++){
printf("Case #%d:\n",tt);
memset(pos,0,sizeof(pos));
int n;
scanf("%d",&n);
char str[10];
int dir = 1; // 方向标量
int ltop = ZERO; // 反向栈顶
int rtop = ZERO + 1; //正向栈顶
int lz = ZERO; // 反向栈顶0
int rz = ZERO + 1; // 正向栈顶0
int x;
for (int i = 1;i <= n;i ++){
scanf("%s",str);
if (str[0] == 'P' && str[1] == 'U'){
scanf("%d",&x);
if (dir > 0){
if (x == 0)
pos[rz++] = rtop;
rtop++;
}else {
if (x == 0)
pos[lz--] = ltop;
ltop--;
}
}else if (str[0] == 'P' && str[1] == 'O'){
if (dir > 0){
if (pos[rz - 1] == rtop - 1) // 弹出0
pos[rz - 1] = 0,rz--;
rtop--;
}else {
if (pos[lz + 1] == ltop + 1) // 弹出0
pos[lz + 1] = 0,lz++;
ltop++;
}
}else if (str[0] == 'R'){
dir = - dir;
}else{
// cout << "top: " << ltop << " " << rtop << endl;
// cout << "lz: " << lz << " " << rz << endl;
// cout << "pos: " << pos[lz + 1] << " " << pos[rz - 1] << endl;
// cout << "dir: " << dir << endl;
if (ltop + 1 > rtop - 1){ // 栈中元素为空
printf("Invalid.\n");
continue;
}
if (dir > 0){
if (pos[lz + 1] > ltop && pos[lz + 1] < rtop){ // 栈中有0
if (pos[lz + 1] == ltop + 1){ //栈底为0
puts("1");
continue;
}
// 考虑 111...110 与 1111...011...111
int l = pos[lz + 1] - ltop - 1; // 栈底0以下的1的个数
bool has = (pos[lz + 1] == rtop - 1 ? 0 : 1); // 0上是否有0
if ((l & 1) ^ has){ //分类讨论得出
puts("1");
}else{
puts("0");
}
}else { // 全1
int sum = rtop - 1 - ltop;
if (sum & 1){
puts("1");
}else {
puts("0");
}
}
}else {
// 镜像对称,反向考虑即可
if (pos[rz - 1] > ltop && pos[rz - 1] < rtop){
if (pos[rz - 1] == rtop - 1){
puts("1");
continue;
}
int l = rtop - 1 - pos[rz - 1];
bool has = (pos[rz - 1] == ltop + 1 ? 0 : 1);
if ((l & 1) ^ has){
puts("1");
}else{
puts("0");
}
}else {
int sum = rtop - 1 - ltop;
if (sum & 1){
puts("1");
}else {
puts("0");
}
}
}
}
}
}
return 0;
}
hdu 5929 Basic Data Structure 模拟
最新推荐文章于 2019-05-09 00:55:54 发布