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种操作实现将 ...
随机推荐
- 各大Oj平台介绍[转]
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
- Java 字节码
Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于Java语言的深度理解和运用,毕竟是很少会有人涉及的话题.In ...
- 【HDU3065】 病毒侵袭持续中(AC自动机)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- C语言嵌入式系统编程修炼之一:背景篇
不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发 ...
- 迅雷创始人程浩:创业公司5招做好内部创新(组建小型敢死队:一共3个人,一个产品经理,两个研发;腾讯做不做这个项目是一个伪命题;让用户来验证,而不是相反 good)
欢迎关注“创事记”的微信订阅号:sinachuangshiji 文/程浩 编者按:本文首发于微信公众号“浩哥说”(ID:haogetalks),作者程浩,迅雷创始人.内容为作者在混沌AI成长营上的演讲 ...
- 编码问题(.java/.jsp/.js等文件的中文乱码)
乱码的出现是因为编码与解码的不一致造成的,假如你对“中文”两个字进行了gbk格式的保存,却用utf-8格式的解读,是肯定会出现乱码的. 如何避免中文乱码:应用上下统一用一种编码格式. utf-8或者g ...
- Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...
- Linq中小心使用IndexOf
我们平常在做字符串的模糊查询时,有可能会用到下面的类似LINQ写法: string.IsNullOrEmpty(_SN) ? true : a.SN.IndexOf(_SN) != -1 这条 ...
- POJ 1159 Palindrome 最长公共子序列的问题
Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...
- [LeetCode] Distinct Subsequences 解题思路
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...