二分 貪心 打字機

2021-10-09 12:48:07 字數 1347 閱讀 8223

懷疑是cf題,因為題目真的太優美了

首先我們需要觀察到乙個性質:棧中的元素序列一定形如 abc

abca

..

.\mathrm

abcabc

a...

的形式。

我們令新增為 2

22 貢獻,彈出為 0

00 貢獻。

假設前面出現為 abab

ab,你需要在棧中新增元素 a

aa :一定是把 b

bb 彈出

若前面的元素是 abc

abcab

c,你需要在棧中新增元素 a

aa :一定是在棧頭新增元素 a

aa 。

我們發現,上面第二條結論成立的條件是後面不加入 b

bb 或 c

cc 了

這意味著棧中的元素已經足夠後面的元素彈出了。因此我們得到了結論:

這樣我們就得到了序列的形態:某乙個分界點前面,我們去維護迴圈序列;某乙個分界點後面,我們不斷彈出棧中元素。列舉分界點,我們可以得到 o(n

2)

o(n^2)

o(n2

) 的演算法。

觀察都某乙個點 x

xx 是乙個合法分解點,那麼 x+1

x+1x+

1 顯然也是乙個合法的分界點。且第 x+1

x+1x+

1 個點貢獻為 2

22 ,彈出貢獻為 0

00 ,所以我們只需要二分找到合法的最小分界點就能得到最優解。

時間複雜度:o(n

log⁡n)

o(n\log n)

o(nlogn)

.

#include

using

namespace std;

const

int n =

3e5;

int n, res =

1e9, top;

char a[n]

, st[n]

;int

check

(int x)

for(

int i=x+

1;i<=n;

++i)

return cnt;

}int

main

(void)if

(check

(l)<

1e9) cout <<

check

(l);

else cout <<

check

(r);

return0;

}

高階打字機

早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 t x 在文章末尾打下乙個小寫字母x。type操作 u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 q x 詢問當前文章中第x個字...

高階打字機

題目描述 請為一種高階打字機設計乙個程式,支援如下3種操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 文章一開始可以視為空串。輸入描述 第1行 乙個整數n,表示運算元量。以下n行,每行乙個命令。保證輸入的命令合法。輸出描述 每行輸出乙個字母,表示query操...

高階打字機

題目描述 早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 1.t x 在文章末尾打下乙個小寫字母x。type操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 3.q x ...