/*
好题啊 好题啊
而然还是看了一眼题解啊
有那么一点思路 但是离写出代码还很远
考虑必须分开放倒两个栈里的情况
即存在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 双栈排序的更多相关文章

  1. 双栈排序(codevs 1170)

    题目描述 Description Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈 ...

  2. 双栈排序(codevs 1170)题解

    [问题描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...

  3. Noip2008双栈排序

    [问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...

  4. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  5. noip2008 双栈排序

    题目描述 Description \(Tom\)最近在研究一个有趣的排序问题.如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),\(Tom\)希望借助以下\(4\)种操作实现将输入序列升序排 ...

  6. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

  7. #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  8. [NOIP2008] 提高组 洛谷P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  9. 【NOIP2008】双栈排序

    感觉看了题解还是挺简单的,不知道当年chty同学为什么被卡了呢么久--所以说我还是看题解了 原题: Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将 ...

随机推荐

  1. [BZOJ 2178] 圆的面积并 【Simpson积分】

    题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13  2)要去掉被其他圆包含的圆. ...

  2. document.styleSheets

    伪元素是不能选中的,如果非要改他的样式,两个方法. 静态方法: addClass的时候,新add的class带有新的伪元素. 动态方法: 如果知道它在document.styleSheets对象中的位 ...

  3. HTML5区域范围文本框实例页面

    CSS代码: input { font-size: 14px; font-weight: bold; } input[type=range]:before { content: attr(min); ...

  4. Android 中的MVC与数据流动

    今天看了一个Android的Training生命周期转换的例子,顿觉得他的设计非常巧妙,我的分析如下: 1.在com.example.android.lifecycle包中有: 3个正常的全屏acti ...

  5. Android Fragment实现分屏

    在项目中碰到一个问题,新开发一个平板APP,项目要求是把原来的一个手机端APP放在项目左侧显示,右侧添加新加的功能. 首先想到了Fragment,以前做过Fragment的一些简单的Demo,但是都没 ...

  6. [学习整理]eclipe/MyEclipse:重要的快捷键

    一.查看大工程代码最重要的几个快捷键 其实有一些,直接在编辑器页面内右键也可查看相应的快捷键(比如F3,F4,Ctrl+O,Ctrl+T),但有些比较好用的快捷键,并不能能直接或方便地在eclipse ...

  7. Render To Texel Baker

    今天仔细研究了 Shaowgun 示例中那个金黄色雕像所使用的光照纹理烘焙工具:“Render To Texel Baker”.因为要在移动设备展现比较逼真的光照效果,但是实时使用法线贴图并大量用于场 ...

  8. 用指针将字符串a的内容复制到字符串b

    #include <stdio.h> #include <stdlib.h> /**int main() { char a[]="i love you very ma ...

  9. godaddy.com 注册域名 买卖域名

    https://www.godaddy.com/domains/searchresults.aspx?ci=83269&checkAvail=1&domainToCheck=ses.x ...

  10. apply和call详解

    1.        apply和call的区别在哪里 2.        什么情况下用apply,什么情况下用call 3.        apply的其他巧妙用法(一般在什么情况下可以使用apply ...