NOIP2008 雙棧排序

2021-10-11 01:40:37 字數 1513 閱讀 1497

link

考慮什麼時候 (i,

j)

(i,j)

(i,j

) 可以被放到同乙個棧裡面

我們只需要考慮如果我們把 (i,

j)

(i,j)

(i,j

) 放一起後面會不會出現矛盾

假設有 i

<

j

i<

j<

k,觀察每一種排列,只有當 a

k

a_kak

​​​ 的時候,是會出現問題的,我們不能構造一種方案滿足這個條件

所以我們通過計算字尾最小值可以確定哪兩個不能放在棧裡面

然後我們判斷這個圖是不是二分圖就可以了,染色的時候,應該優先讓編號小的染成黑色,最後輸出的時候注意字典序的問題,如果後面還要往第乙個棧裡加數的時候,應當等加完了彈出第二個棧

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

# define rep(i,a,b) for(register int i=a;i<=b;i++)

# define _rep(i,a,b) for(register int i=a;i>=b;i--)

# define repg(i,u) for(int i=head[u];~i;i=e[i].next)

typedef

long

long ll;

const

int n=

1005

;template

<

typename t>

void

read

(t &x)

int n;

int a[n]

;int f[n]

;bool g[n]

[n];

int color[n]

;int s1[n]

,top1,s2[n]

,top2;

bool

dfs(

int u,

int c)

return res;

}int

main()

else

rep(i,now,n)

if(top1&&s1[top1]

==i)

printf

("b "

),top1--

;else

printf

("d "

),top2--

;puts(""

);return0;

}

noip 2008 雙棧排序

題目大意 給定n和一串數字,這串數字是乙個1 n的排列。現在要用兩個棧給這些數字排序。首先先判斷是否有解,有解的話再輸出字典序最小的方案 入棧1,輸出a,出棧1,輸出b 入棧2,輸出c,出棧2,輸出d 分析 首先必然要先考慮是否有解。對於沒有解的情況,必然是當到了某乙個數x0時,棧1,棧2隊首元素都...

noip 2008 雙棧排序

題目大意 給定n和一串數字,這串數字是乙個1 n的排列。現在要用兩個棧給這些數字排序。首先先判斷是否有解,有解的話再輸出字典序最小的方案 入棧1,輸出a,出棧1,輸出b 入棧2,輸出c,出棧2,輸出d 分析 首先必然要先考慮是否有解。對於沒有解的情況,必然是當到了某乙個數x0時,棧1,棧2隊首元素都...

noip2008 雙棧排序

tom 最近在研究乙個有趣的排序問題。如圖所示,通過 2 個棧 s 1 和 s 2 tom 希望借助以下 4 種操作實現將輸入序列公升序排序。操作 a 如果輸入序列不為空,將第乙個元素壓入棧 s 1 操作 b 如果棧 s 1 不為空,將 s 1 棧頂元素彈出至輸出序列 操作 c 如果輸入序列不為空,...