P1155 雙棧排序

2022-04-06 15:03:48 字數 922 閱讀 7134

miku

規律:假如只有乙個棧,那麼如果原序列存在三個數x\(v_y>v_x>v_z\)

那麼就不可能排序成功,但是這裡有兩個棧,那麼就應該把原序列分成兩部分

兩部分?二分圖。

把不能在一起的點連邊,進行二分圖染色。

如果成功,就意味著存在&&兩個棧的成員搞定了

反之不存在

#include#include#include#include#includeusing namespace std;

int n;

int fi[1001];

struct e edge[10000001];

int color[1001];

int rm[1001];

stack s1,s2;

int p;

int s=1;

int ord=1;

int head[1001];

void add(int f,int t)

int v;

void dfs(int now,int c)

if(color[v]==-1) }}

void find()

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

void print()else

while((!s1.empty()&&fi[s1.top()]==ord)||(!s2.empty()&&fi[s2.top()]==ord))

while(!s2.empty()&&fi[s2.top()]==ord)

} }}int main()

rm[n+1]=0x7f7f7f7f;

for(int i=n;i;--i)

find();

if(s==0)else

return 0;

}

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 雙棧排序

本來以為是一道排序題,然而看了一眼標籤 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...