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 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; } 題目大意 給定n和一串數字,這串數字是乙個1 n的排列。現在要用兩個棧給這些數字排序。首先先判斷是否有解,有解的話再輸出字典序最小的方案 入棧1,輸出a,出棧1,輸出b 入棧2,輸出c,出棧2,輸出d 分析 首先必然要先考慮是否有解。對於沒有解的情況,必然是當到了某乙個數x0時,棧1,棧2隊首元素都... 題目大意 給定n和一串數字,這串數字是乙個1 n的排列。現在要用兩個棧給這些數字排序。首先先判斷是否有解,有解的話再輸出字典序最小的方案 入棧1,輸出a,出棧1,輸出b 入棧2,輸出c,出棧2,輸出d 分析 首先必然要先考慮是否有解。對於沒有解的情況,必然是當到了某乙個數x0時,棧1,棧2隊首元素都... tom 最近在研究乙個有趣的排序問題。如圖所示,通過 2 個棧 s 1 和 s 2 tom 希望借助以下 4 種操作實現將輸入序列公升序排序。操作 a 如果輸入序列不為空,將第乙個元素壓入棧 s 1 操作 b 如果棧 s 1 不為空,將 s 1 棧頂元素彈出至輸出序列 操作 c 如果輸入序列不為空,...#include
noip 2008 雙棧排序
noip 2008 雙棧排序
noip2008 雙棧排序