JZOJ2530( 1812 初中 )雙棧排序

2021-08-10 05:14:40 字數 1060 閱讀 3518

題目描述

tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。

操作a如果輸入序列不為空,將第乙個元素壓入棧s1

操作b如果棧s1不為空,將s1棧頂元素彈出至輸出序列

操作c如果輸入序列不為空,將第乙個元素壓入棧s2

操作d如果棧s2不為空,將s2棧頂元素彈出至輸出序列

如果乙個1~n的排列p可以通過一系列操作使得輸出序列為1,2,…,(n-1),n,tom就稱p是乙個「可雙棧排序排列」。例如(1,3,2,4)就是乙個「可雙棧排序序列」,而(2,3,4,1)不是。

當然,這樣的操作序列有可能有幾個,對於上例(1,3,2,4),是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。

這道題要用到玄學之二分圖染色

首先,弄乙個字尾和,h[i]表示第i個數後面的數中最小的數(包括第i個),

接著i從1列舉到n,

如果b[j]=0

如果b[i]=0則b[i]=1,b[j]=2,然後給b[i]與b[j]連一條邊,

如果b[i]<>0則b[j]=3-b[i],然後給b[i]與b[j]連一條邊,

b[j]<>0

如果b[i]=0則b[i]=3-b[j],然後給b[i]與b[j]連一條邊,

如果b[i]<>0則b[j]=3-b[i],然後給b[i]與b[j]連一條邊,

然後用乙個過程判斷一下是否存在乙個點k與點j相連,且b[j]=b[k],

用乙個ans來存下乙個應該出棧的數的數值

用乙個k來存下乙個應該入棧的數的數值

s1表示棧1

s2表示棧2

while ans<=n 

如果i<=n

如果b[i]=1且(a[i]

如果s1棧頂=ans,就把s1棧頂出棧,輸出'b 』,inc(ans)

如果b[i]=2且(a[i]

如果s2棧頂=ans,就把s2棧頂出棧,輸出'd 』,inc(ans)

如果i>n

判斷s1棧頂和s2棧頂哪個可以出棧

然後輸出'b '或『d '

就這樣了。。。

Jzoj2682 最長雙回文串

順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。pam模 mu 板題 非常好寫 弄出pam讓後記錄每個結尾的最長回文串讓...

JZOJ 5637 一雙木棋

傳送門 考場上的思路 什麼叫做最優策略?我暴力都打不來怎麼辦?好像 n,m 2 n,m 2 可以直接得出答案,m 1 m 1 也可以直接算,就這樣有了 25 25 分。但是不能坐以待斃啊!觀察了一下 n,m 2 n,m 2 是怎麼算的,發現需要做一次決策,且這次決策由後手決定。乖乖,還是寫個 dp ...

JZOJ4804 成績調研 模擬 雙指標

顯然的,對於任意乙個確定的r r,滿足題目要求的序列左端點肯定是一段連續的區間 lr 1 r2 lr 1 r 2 而且這個區間顯然是滿足單調性的。所以可以用三個指標維護l1,l2,r l1,l 2,r。每次把r r指標右移一位時維護l1l 1和l2l 2,然後答案累加就可以了。均攤時間複雜度為o n...