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 如果輸入序列不為空,...