codevs 1170 双栈排序
/*
好题啊 好题啊
而然还是看了一眼题解啊
有那么一点思路 但是离写出代码还很远
考虑必须分开放倒两个栈里的情况
即存在i<j<k 有 a[k]<a[i]<a[j] 这里RMQ n*n搞一下
那如果出现 a b 不在一块 b c 不在一块 a c 不在一块
那么两个栈显然办不了了
所以嘛 因为只有俩栈 染色吧那就
染完判一下输出0的情况
同时不相邻的那些的块块 按字典序染
然后就就模拟一下 就像个普通的火车进站类似的题
只不过有两个栈
注意当可以进2出1的时候 先出1 这样字典序小
(感觉到了字典序深深地恶意)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
int n,m,a[maxn],num,head[maxn],color[maxn],mx[maxn][],P[maxn],falg;
int s1[maxn],top1,s2[maxn],top2;
struct node{
int v,pre;
}e[maxn*maxn*];
int max(int x,int y){
return x>y?x:y;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Insert(){
memset(mx,/,sizeof(mx));
for(int i=;i<=n;i++)mx[i][]=a[i];
for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
mx[i][j]=min(mx[i][j-],mx[i+(<<j-)][j-]);
}
void Get(){
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
if((<<j)>i){
P[i]=j-;break;
}
}
int Query(int l,int r){
int k=P[r-l+];
return min(mx[l][k],mx[r-(<<k)+][k]);
}
int Dfs(int x){
for(int i=head[x];i;i=e[i].pre){
int v=e[i].v;
if(color[v]==){
color[v]=-color[x];
if(!Dfs(v))return ;
}
else if(color[v]==color[x])return ;
}
return ;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
Insert();Get();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
if(a[i]>a[j])continue;
int mx=Query(j+,n);
if(mx<a[i])Add(a[i],a[j]),Add(a[j],a[i]);
}
for(int i=;i<=n;i++)
if(color[i]==){
color[i]=;
if(!Dfs(i)){falg=;break;}
}
if(falg==){printf("0\n");return ;}
int now=;
for(int i=;i<=n;i++){
if(color[a[i]]==){
if(a[i]==now){printf("a b ");now++;}
else{
while(a[i]>s1[top1]&&top1){
top1--;printf("b ");
}
s1[++top1]=a[i];printf("a ");
}
}
else {
if(a[i]==now){printf("c d ");now++;}
else{
while(a[i]>s2[top2]&&top2){
top2--;printf("b ");
}
while(s1[top1]==now){
top1--;printf("b ");now++;
}
s2[++top2]=a[i];printf("c ");
}
}
}
for(int i=now;i<=n;i++){
while(top1&&i==s1[top1]){
top1--;printf("b ");
}
while(top2&&i==s2[top2]){
top2--;printf("d ");
}
}
return ;
}
codevs 1170 双栈排序的更多相关文章
- 双栈排序(codevs 1170)
题目描述 Description Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈 ...
- 双栈排序(codevs 1170)题解
[问题描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...
- Noip2008双栈排序
[问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- noip2008 双栈排序
题目描述 Description \(Tom\)最近在研究一个有趣的排序问题.如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),\(Tom\)希望借助以下\(4\)种操作实现将输入序列升序排 ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
- #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 【NOIP2008】双栈排序
感觉看了题解还是挺简单的,不知道当年chty同学为什么被卡了呢么久--所以说我还是看题解了 原题: Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将 ...
随机推荐
- 《agile java》First : 起步 + 章节练习题
第一章节:起步 1.创建简单Java类2.创建测试类3.使用JUnit4.学习构造函数5.重构代码 涉及知识:TDD.UML TDD: Test Driven Development, 测试驱动开发. ...
- 实验一个最小的PYTHON服务器编程
没事,玩玩儿~~~:) 按书上的例子来作.. #!/usr/bin/env python #Simple Server - Chapter 1 -server.py import socket hos ...
- ibatis 中isNull, isNotNull与isEmpty, isNotEmpty区别
在iBATIS中isNull用于判断参数是否为Null,isNotNull相反 isEmpty判断参数是否为Null或者空,满足其中一个条件则其true isNotEmpty相反,当参数既不为Null ...
- AStyle代码格式工具在source insight中的使用
一.AStyle下载路径 Astyle为开源项目,支持C/C++和java的代码格式化 Home Page: http://astyle.sourceforge.net/ Project Page: ...
- 一起啃PRML - Preface 前言
一起啃PRML - 前言 Preface @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ PRML,Pattern Recognition and M ...
- maya 操作自我整理(二)
随身携带自己的maya习惯我们在一台电脑上设置好自己的使用习惯,包括自己定义的快捷键.标记菜单.界面颜色.工具架等信息,当换到另一个工作环境时再进行设置十分不便利,将自己的习惯随身带走有利于我们更快捷 ...
- Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
题目:http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Des ...
- 像素,分辨率,PPI(像素密度),BPP 扫盲
像素于分辨率 像素,又称画素,为图像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“图像元素”之 ...
- openStack 瓶颈测试
- Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区
Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区 undefined