4444 Scoi2015 國旗計畫

2021-07-17 04:09:05 字數 2412 閱讀 7744

time limit: 20 sec  

memory limit: 256 mb

submit: 246  

solved: 111 [

submit][

status][

discuss]

a國正在開展一項偉大的計畫——國旗計畫。這項計畫的內容是邊防戰士手舉國旗環繞邊境線奔襲一圈。這

項計畫需要多名邊防戰士以接力的形式共同完成,為此,國土安全域性已經挑選了n名優秀的邊防戰上作為這

項計畫的候選人。

a國幅員遼闊,邊境線上設有m個邊防站,順時針編號1至m。每名邊防戰士常駐兩個邊防站,並且善於

在這兩個邊防站之間長途奔襲,我們稱這兩個邊防站之間的路程是這個邊防戰士的奔襲區間。n名邊防戰士

都是精心挑選的,身體素質極佳,所以每名邊防戰士的奔襲區間都不會被其他邊防戰士的奔襲區間所包含。

現在,國十安全域性局長希望知道,至少需要多少名邊防戰士,才能使得他們的奔襲區間覆蓋全部的邊境線,

從而順利地完成國旗計畫。不僅如此,安全域性局長還希望知道更詳細的資訊:對於每一名邊防戰士,在他必

須參加國旗計畫的前提下,至少需要多少名邊防戰士才能覆蓋全部邊境線,從而順利地完成國旗計畫。

第1行,包含2個正整數n,m,分別表示邊防戰士數量和邊防站數量。

隨後n行,每行包含2個正整數。其中第i行包含的兩個正整數ci、di分別表示i號邊防戰士常駐的兩個邊防站編號,

ci號邊防站沿順時針方向至di號邊防站力他的奔襲區間。資料保證整個邊境線都是可被覆蓋的。

輸出資料僅1行,需要包含n個正整數。其中,第j個正整數表示j號邊防戰士必須參加的前提下至少需要

多少名邊防戰士才能順利地完成國旗計畫

4 8

2 5

4 7

6 1

7 33 3 4 3

n≤2×10^5,m< 10^9,1≤ci,di≤m [

submit][

status][

discuss]

乙個貪心,假設你當前已經覆蓋了區間[l,r],要選擇的下乙個戰士,一定是能覆蓋到的右端點越右端越好

令f[r]為當前覆蓋到的右端點為r,選擇下一位戰士後,能往右覆蓋到的最右端的值

因為題中給的區間不相交,所以只要一直把右端點往右邊推就好了

事實上原題中給的是乙個環

如果我們將[1,m]連寫兩遍,那麼每個戰士的區間都可以以它左端點起向右無腦擴一條鏈出來

分塊下維護要走多少次能夠跑出去。。

記得離散座標額。。

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

const int maxn = 4e5 + 20;

const int maxm = 2*maxn;

int n,m,sqrt,cnt,cur = 1,l[maxn],r[maxn],belong[maxm],a[maxn],

from[maxm],to[maxm],f[maxm],nex[maxm],w[maxm];

int main()

sort(a + 1,a + tot + 1);

for (int i = 2; i <= tot; i++)

if (a[i] != a[i-1])

a[++cur] = a[i];

m = cur; sqrt = sqrt(2*m);

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

else

} int a = 1,b = sqrt;

from[cnt = 1] = 1;

for(int i = 1; i <= 2*m; i++)

belong[i] = cnt;

} to[cnt] = 2*m; belong[2*m+1] = cnt+1;

for (int i = 2*m; i; i--)

else nex[i] = nex[j],w[i] = w[j] + 1; }

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

while (pos < r)

++ans,pos = f[pos];

if (i < n) printf("%d ",ans + 1);

else cout << ans + 1;

} return 0;

}

bzoj 4444 Scoi2015 國旗計畫

破環成鏈,對於每個點的策略是找最後乙個能傳遞到的旗手,每個點都指向乙個特定的點,這樣形成了一棵樹。如果father x 傳遞到的最後乙個點是y,那麼x傳遞到的最後乙個點在x到y的路徑上,所以如果把一條鏈看成一段決策,那麼決策點所在的深度是不減的。所以可以對樹進行dfs,維護乙個雙端佇列,每次暴力進出...

bzoj4444 Scoi2015 國旗計畫

題目傳送門 好題解法 因為區間互不包含。那麼左端點在區間內最右邊的的區間一定是當前區間能擴充套件到最遠的區間。這句話有點繞。舉個例子。假設當前區間為1 5。那麼我們往右擴充套件。找到左端點最右且小於等於5的區間。這個區間一定是最優解。因為區間互不包含啊。如果這個區間不是最優解的話那麼就被別的包含了。...

BZOJ4444 Scoi2015 國旗計畫

首先將座標離散化,因為區間互不包含,可以理解為對於每個起點輸出最少需要多少個戰士。將環倍長,破環成鏈,設 f i 表示區間左端點不超過 i 時右端點的最大值,可以通過 o n 遞推求出。那麼如果將 f i 看成 i 的祖先的話,它實際上形成了一棵以 2n 為根的樹。首先暴力計算出1號點的答案 t 設...