傳送門 to luogu
感謝@kkksc03 的部落格提供了思路;感謝@嗶哩嗶哩 的部落格提供了**。
2 n2n
2n個人,只有 n
nn 分鐘,所以每一分鐘,兩個廁所都在使用中。
簡化題意:操作 n
nn 次,每次拿出兩個等待佇列的元素刪掉。刪掉的規則:
我們的目的是,每次都能成功的刪去兩個元素。
有幾個很顯然的結論(但是很重要):
結論一這句話很簡單:如果佇列中男多女少,那麼失敗。這是很顯然的——畢竟不會同時刪去兩個 m
mm ,男女比例只會愈發失調。
更有意思的是,如果會失敗,那麼一定在某一瞬間出現了男多女少的狀況。根據顯然結論二
,失敗時一定是情況一,即:隊頭是男性,但後方沒有女性了。這不就是男多女少的情況嘛!
結論二如果存在乙個字尾,滿足男性的數量 =
== 女性的數量 +2+2
+2,那麼一定不能成功的如廁。
注:如果存在乙個字尾,滿足男性的數量 ≥試著去證明它吧。考慮乙個這樣的字尾,它一定是以 m\ge≥ 女性的數量 +2+2
+2,那麼也一定存在乙個字尾,使其取等。
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 ;隊頭也無需特殊考慮:如果隊頭都不滿足條件,就可以直接說拜拜了(所以說要記得特判)。
所以我們到底要調整多少個男性呢?其實就是 (
maxsu
m)−1
(\max sum)-1
(maxsu
m)−1
唄——把 (
maxsu
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為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...