【推导】【线段树】hdu5929 Basic Data Structure
题意:
维护一个栈,支持以下操作:
从当前栈顶加入一个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的更多相关文章
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 5929 Basic Data Structure 模拟
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- Basic Data Structure
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- Basic Data Structure HDU - 5929 (这个模拟我要报警了)
Mr. Frog learned a basic data structure recently, which is called stack.There are some basic operati ...
- hdu 5929 Basic Data Structure
ゲート 分析: 这题看出来的地方就是这个是左结合的,不适用结合律,交换律. 所以想每次维护答案就不怎么可能了.比赛的时候一开始看成了异或,重读一遍题目了以后就一直去想了怎么维护答案...... 但是很 ...
- 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 ...
- E. Alice and the Unfair Game(推导线段树)
题:https://codeforces.com/contest/1236/problem/E 粗自:https://www.cnblogs.com/YSFAC/p/11715522.html #in ...
- OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树
描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...
随机推荐
- Java生成验证码简记
验证码定义 验证码(captcha):是一种区分用户是计算机还是人的公共全自动程序. 作用:可以防止恶意破解密码.刷票.灌水,有效防止对某一个特定注册用户用特定程序进行暴力破解的登录尝试. 验证码交互 ...
- three.js轨道控制器OrbitControls.js
https://blog.csdn.net/qq_37338983/article/details/78575333 文章地址
- 再续 virtualenv II
为什么搭建虚拟环境 搭建 Python 虚拟环境,可以方便的解决不同项目中对类库的依赖问题.当然,也可以方便地Python2,Python3 共存.避免包的混乱和版本的冲突.为每个程序单独创建虚拟环境 ...
- git命令大全【转】
转自:http://www.jqhtml.com/8235.html 初始化本地git仓库(创建新仓库) git init 配置用户名 git config --global user.name &q ...
- java线上应用故障排查之二:高内存占用【转】
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...
- 批量删除.svn文件夹和.svn文件
新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...
- LINUX下解决netstat查看TIME_WAIT状态过多问题(转)
原文连接:www.itokit.com/2012/0516/73950.html # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSIN ...
- /bin、/sbin、/usr/bin、/usr/sbin目录Linux执行文档的区别
/bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件 ...
- 关于IdByName 为什么一个消息主题要有 Id和 Name的解释
- Appium+python 一个简单的登录测试实例
# coding=utf-8 from appium import webdriver import time import unittest import os import HTMLTestRun ...