题意:

维护一个栈,支持以下操作:

从当前栈顶加入一个0或者1;

从当前栈顶弹掉一个数;

将栈顶指针和栈底指针交换;

询问a[top] nand a[top-1] nand ... nand a[bottom]的值。

nand是这样定义的:

∙∙ 0 nand 0 = 1 
∙∙ 0 nand 1 = 1 
∙∙ 1 nand 0 = 1 
∙∙ 1 nand 1 = 0

关键是要发现性质,任何数nand 0,都会变成1。反复nand上1的话,则值会交替变化。

所以假设当前栈顶在左侧,只需要找到最右侧的0的位置,然后按照其右侧1的数量的奇偶性输出零或者一即可(如果最右侧的0在最左端,则其右侧有奇数个1就输出1,否则输出零。如果最右侧的零不在最左端,则其右侧有奇数个1就输出零,否则输出1)。

栈顶在右侧的情况同理。

用线段树维护。

#include<cstdio>
#include<cstring>
using namespace std;
bool hav[400005<<2];
int a[400005];
int T,m,n,e[2];
void update(int p,int v,int rt,int l,int r){
if(l==r){
if(v==0){
hav[rt]=1;
}
else{
hav[rt]=0;
}
return;
}
int m=(l+r>>1);
if(p<=m){
update(p,v,rt<<1,l,m);
}
else{
update(p,v,rt<<1|1,m+1,r);
}
hav[rt]=(hav[rt<<1] || hav[rt<<1|1]);
}
int find1(int rt=1,int l=1,int r=n){
if(l==r){
return l;
}
int m=(l+r>>1);
if(hav[rt<<1]){
return find1(rt<<1,l,m);
}
else{
return find1(rt<<1|1,m+1,r);
}
}
int find2(int rt=1,int l=1,int r=n){
if(l==r){
return l;
}
int m=(l+r>>1);
if(hav[rt<<1|1]){
return find2(rt<<1|1,m+1,r);
}
else{
return find2(rt<<1,l,m);
}
}
int main(){
//freopen("h.in","r",stdin);
int x;
bool dir=0;
char op[10];
scanf("%d",&T);
memset(a,-1,sizeof(a));
for(int zu=1;zu<=T;++zu){
printf("Case #%d:\n",zu);
scanf("%d",&m);
e[0]=m;
e[1]=m+1;
n=2*m;
for(int i=1;i<=m;++i){
scanf("%s",op);
if(op[2]=='S'){
scanf("%d",&x);
if(!dir){
a[e[0]]=x;
update(e[0],x,1,1,n);
--e[0];
}
else{
a[e[1]]=x;
update(e[1],x,1,1,n);
++e[1];
}
}
else if(op[2]=='P'){
if(!dir){
++e[0];
a[e[0]]=-1;
update(e[0],-1,1,1,n);
}
else{
--e[1];
a[e[1]]=-1;
update(e[1],-1,1,1,n);
}
}
else if(op[2]=='V'){
dir^=1;
}
else{
if(e[0]==e[1]-1){
puts("Invalid.");
continue;
}
if(hav[1]){
if(!dir){
int p=find2();
if(p==e[0]+1){
puts((e[1]-p-1)%2==1 ? "1" : "0");
}
else{
puts((e[1]-p-1)%2==1 ? "0" : "1");
}
}
else{
int p=find1();
if(p==e[1]-1){
puts((p-e[0]-1)%2==1 ? "1" : "0");
}
else{
puts((p-e[0]-1)%2==1 ? "0" : "1");
}
}
}
else{
puts((e[1]-e[0]-1)%2==1 ? "1" : "0");
}
}
}
memset(a,-1,sizeof(int)*(n+1));
memset(hav,0,sizeof(bool)*(n*4+1));
}
return 0;
}

【推导】【线段树】hdu5929 Basic Data Structure的更多相关文章

  1. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  2. HDU 5929 Basic Data Structure 模拟

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  3. HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  4. Basic Data Structure

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. Basic Data Structure HDU - 5929 (这个模拟我要报警了)

    Mr. Frog learned a basic data structure recently, which is called stack.There are some basic operati ...

  6. hdu 5929 Basic Data Structure

    ゲート 分析: 这题看出来的地方就是这个是左结合的,不适用结合律,交换律. 所以想每次维护答案就不怎么可能了.比赛的时候一开始看成了异或,重读一遍题目了以后就一直去想了怎么维护答案...... 但是很 ...

  7. HDU 5929 Basic Data Structure(模拟 + 乱搞)题解

    题意:给定一种二进制操作nand,为 0 nand 0 = 10 nand 1 = 1 1 nand 0 = 1 1 nand 1 = 0 现在要你模拟一个队列,实现PUSH x 往队头塞入x,POP ...

  8. E. Alice and the Unfair Game(推导线段树)

    题:https://codeforces.com/contest/1236/problem/E 粗自:https://www.cnblogs.com/YSFAC/p/11715522.html #in ...

  9. OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树

    描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...

随机推荐

  1. 写一个简易web服务器、ASP.NET核心知识(4)

    前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...

  2. Spring Boot中使用log4j实现http请求日志入mongodb

    之前在<使用AOP统一处理Web请求日志>一文中介绍了如何使用AOP统一记录web请求日志.基本思路是通过aop去切web层的controller实现,获取每个http的内容并通过log4 ...

  3. 论文里有公式?用texlive+texstudio(windows下)

    要写论文了,但论文里有一大堆公式,感觉很麻烦,经过询问同学知道有tex这么个东西,可以像写代码一样写论文,许多论文的格式都有相关的模板,所以学习一下,这里记录一下环境安装. texlive和texst ...

  4. 【leetcode 简单】第三十二题 买卖股票的最佳时机Ⅱ

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  5. hdu 5328 Problem Killer(杭电多校赛第四场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328 题目大意:找到连续的最长的等差数列or等比数列. 解题思路:1.等差等比的性质有很多.其中比较重 ...

  6. 福建工程学院寒假作业第三周B题

    第二集 你说,你的女朋友就是你的电脑 TimeLimit:2000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld   Problem De ...

  7. Coursera在线学习---第三节.归一化处理(Normalize)

    一.归一化(也说标准化)作用 1)将有量纲特征转化为无量纲特征 2)能够加快收敛(主要指梯度下降法时) 二.Octave中计算          mean(A)   求解矩阵中每一列的均值 std(A ...

  8. Android检测富文本中的<img标签并实现点击效果

    本文旨在:通过点击一张图片Toast输出位置与url链接. 闲话少说,实现原理大概是酱紫的::通过正则表达式检测富文本内的图片集合并获取url,在src=“xxx” 后面添加 onclick方法,至于 ...

  9. 防范XSS跨站2

    原文:http://blog.csdn.net/joeyon1985/article/details/43527987 在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参 ...

  10. vuejs学习——vue+vuex+vue-router项目搭建(一)

    前言 快年底了却有新公司邀请了我,所以打算把上家公司的学到一下技术做一些总结和分享. 现在vuejs都2.0了,我相信也有很多朋友和我一样实际项目还是选择vue1.0的或者给新手一些参考,不管在选择哪 ...