P1155 雙棧排序

2022-07-20 04:48:14 字數 1604 閱讀 6492

本來以為是一道排序題,然而看了一眼標籤

woc,圖論題,一臉懵逼~~~~~~

題意:給你兩個棧,四種操作

如果棧$s_1$​

如果輸入序列不為空,將第乙個元素壓入棧$s_2$​

用f[i]維護字尾最小值

狀態:f[i]=min(a[i],a[i+1], ... ,a[n])

邊界條件:f[n+1]=inf;

狀態轉移方程:f[i]=min(f[i+1],a[i]);

於是上述判斷就轉化為了f[j+1]把時間複雜度從$o(n^3)$優化到了$o(o^2)$

如果a[i]和a[j]不能在乙個棧內,即連線一條i與j之間的無向邊,接下來我們只需要判斷這個圖是否為二分圖

由於題目中說編號的字典序要盡可能的小,那麼就把編號小的盡可能放到stack1

判斷二分圖的方法可以採用黑白染色的方式,先從編號小的開始染,第乙個頂點染成黑色,相鄰的頂點染成不同的顏色,如果發現黑白衝突,那麼說明這個圖不是乙個二分圖,是不合法的,輸出0.

(dfs或bfs染色均可)

詳見**

#include#include

#include

#include

#include

#include

using

namespace

std;

#define olinr return

#define love_nmr 0

#define _ 0

int f[1050

];int xl[1050

];int

n;int col[1050

];vector

g[1050

];queue

q;struct

node

void

pop()

void push(int

x)

bool

empty()

inttop()

};node a;

node b;

/*----------------------------olinr love nmr---------------------------------------

*/inline

void bfs(int

now)

else

if(!(col[go]^col[tp]))}}

}int

main()

}memset(col,-1,sizeof

col);

for(int i=1;i<=n;i++)

if(col[i]==-1

) bfs(i);

int tot=1

;

for(int i=1;i<=n;i++)

else

while((!a.empty()&&a.top()==tot)||(!b.empty()&&b.top()==tot))

else

tot++;}}

olinr ~~(0^_^0)+love_nmr;

}

P1155 雙棧排序

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

P1155 雙棧排序

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

P1155 雙棧排序

miku 規律 假如只有乙個棧,那麼如果原序列存在三個數x v y v x v z 那麼就不可能排序成功,但是這裡有兩個棧,那麼就應該把原序列分成兩部分 兩部分?二分圖。把不能在一起的點連邊,進行二分圖染色。如果成功,就意味著存在 兩個棧的成員搞定了 反之不存在 include include in...