洛谷P3615 如廁計畫

2021-10-01 18:39:58 字數 3608 閱讀 3274

傳送門 to luogu

感謝@kkksc03 的部落格提供了思路;感謝@嗶哩嗶哩 的部落格提供了**。

2 n2n

2n個人,只有 n

nn 分鐘,所以每一分鐘,兩個廁所都在使用中

簡化題意:操作 n

nn 次,每次拿出兩個等待佇列的元素刪掉。刪掉的規則:

我們的目的是,每次都能成功的刪去兩個元素。

有幾個很顯然的結論(但是很重要):

結論一這句話很簡單:如果佇列中男多女少,那麼失敗。這是很顯然的——畢竟不會同時刪去兩個 m

mm ,男女比例只會愈發失調。

更有意思的是,如果會失敗,那麼一定在某一瞬間出現了男多女少的狀況。根據顯然結論二,失敗時一定是情況一,即:隊頭是男性,但後方沒有女性了。這不就是男多女少的情況嘛!

結論二如果存在乙個字尾,滿足男性的數量 =

== 女性的數量 +2+2

+2,那麼一定不能成功的如廁。

注:如果存在乙個字尾,滿足男性的數量 ≥

\ge≥ 女性的數量 +2+2

+2,那麼也一定存在乙個字尾,使其取等。

試著去證明它吧。考慮乙個這樣的字尾,它一定是以 m

mm 作為第乙個;否則可以將其起始端點右移。

對於隊頭的 m

mm ,他可能會與之前的某個 f

ff 一同從佇列裡刪去,也可能和後方的 f

ff 。無論哪種情況,都要注意到這一點:剩下的人,一定是男多女少——原本有 x+2

x+2x+

2 個男性、x

xx 個女性,第乙個男性離開後,剩下的數量為 ⟨x+

1,x⟩

\langle x+1,x\rangle

⟨x+1,x

⟩ 或者 ⟨x+

1,x−

1⟩\langle x+1,x-1\rangle

⟨x+1,x

−1⟩ ——結論一中已經說了,男多女少,是一定無法完成任務的。

結論三如果不存在乙個字尾,滿足男性的數量 =

== 女性的數量 +2+2

+2,那麼一定可以成功的如廁。

試著去證明它吧。為了方便論述,我們討論男性數量 −

-− 女性數量的值——它只要一直不等於 2

22 ,就可以成功如廁。

一開始一定有至少乙個女性(否則男 −

-− 女 ≥

2\ge 2

≥2),所以不會一來就失敗。如果隊頭是女性,沒有任何分析的意義:從隊頭直接拿走兩個,對於剩下元素的字尾沒有改變。所以我們分析隊頭是男性的情況。如圖。

操作之後,對於 f

ff 右邊的,男 −

-− 女沒有發生變動。我們只需要考慮紅色的部分(注意:它們都是 m

mm ;這是由操作的要求規定的)。

正如我用黑筆所寫的差,由於它們忘掉了隊頭的 m

mm (導致 cnt

mcnt_m

cntm

​ 減小),紅色部分原本的差一定

yy (即隊頭的值);f

ff 的離開又讓 cnt

fcnt_f

cntf

​ 減小了 1

11 ,所以差增大了一。最終,這個差 ≤x−

y<

2\le x-y<2

≤x−y

<

2 ,所以我們得到的仍然是乙個滿足條件的佇列。

也就是說,對於乙個滿足該條件的序列,第一次操作不會失敗,並且操作後仍然滿足條件。所以最終可以成功的完成如廁任務。

總結結論

總結一下:將男性設為 1

11 、女性設為 −1-1

−1,只需控制字尾和一直小於 2

22(也就是充要條件)。

改變序列

你至少得發現這一點:同一種性別之間的內部順序不發生變化。因為不愉快度就是逆序對,將其交換,逆序對只會更少,並且仍然是合法的佇列。

一定要注意,我們要最小化的是不愉快度的最大值,而非其總和。

假設當前的序列不能完成任務,那麼我們就要試著去調整它。考慮每次調整乙個男性的位置。

我們實行如下策略:找到最後一名男性,將其往前移動,直到遇到另一名男性。然後這一名男性繼續前移……直到某一名男性走到隊伍的最前。

顯然,男性之間的相對位置不會改變,女性也只會被某乙個原本在後方的男性超過。所以此時的不愉快度的最大值恰好增大 1

11 (這裡的增量是不可避免的:只消考慮一下最前方的女性即可)。

發現這樣的操作相當於將最後方的 m

mm 移動到了佇列最前方,字尾和(除了隊頭和最後方的一段連續的 f

ff )整體減小一:cnt

mcnt_m

cntm

​ 減少了一嘛。

最後一段連續的 f

ff 沒必要特殊考慮:我不信乙個負數會大於等於 2

22 ;隊頭也無需特殊考慮:如果隊頭都不滿足條件,就可以直接說拜拜了(所以說要記得特判)。

所以我們到底要調整多少個男性呢?其實就是 (

max⁡su

m)−1

(\max sum)-1

(maxsu

m)−1

唄——把 (

max⁡su

m)(\max sum)

(maxsu

m)調整為 1

11 就行。

當然咯,答案至少是 0

00 嘛(不然操作 −1-1

−1次是什麼東西?時光倒流?)。然後就沒了。

#include
#include

#include

#include

using

namespace std;

inline

long

long

readint()

inline

void

writeint

(long

long x)

const

int maxn =

100005

;long

long k[maxn]

, n, sum[maxn]

, maxsuf[maxn]

, m;

char s[maxn<<1]

;int

main()

}long

long ans =

1, suf =0;

for(

int i=m; i;

--i)

if(suf >=2)

// 總和都不滿足

puts

("-1");

else

// 輸出的是 max 字尾和 - 1 的值

writeint

(ans-1)

,putchar

('\n');

return0;

}

洛谷 P2680 運輸計畫

公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球...

洛谷 P1137 旅行計畫

題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...

洛谷P1137 旅行計畫

題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...