國旗計畫(flag)

2021-09-02 07:18:52 字數 1645 閱讀 7361

a國正在開展一項偉大的計畫——國旗計畫。這項計畫的內容是邊防戰士手舉國旗環繞邊境線奔襲一圈。這項計畫需要多名邊防戰士以接力的形式共同完成,為此,國土安全域性已經挑選了n名優秀的邊防戰士作為這項計畫的候選人。

a國幅員遼闊,邊境線上設有m個邊防站,順時針編號1至m。每名邊防戰士常駐兩個邊防站,並且善於在這兩個邊防站之間長途奔襲,我們稱這兩個邊防站之間的路程是這兩個邊防戰士的奔襲區間。n名邊防戰士都是精心挑選的,身體素質極佳,所以每名邊防戰士的奔襲區間都不會被其他邊防戰士的奔襲區間所包含。

現在,國土安全域性局長希望知道,至少需要多少名邊防戰士,才能使得他們的奔襲區間覆蓋全部的邊境線,從而順利地完成國旗計畫。不僅如此,安全域性局長還希望知道更詳細的資訊:對於每一名邊防戰士,在他必須參加國旗計畫的前提下,至少需要多少名邊防戰士才能覆蓋全部邊境線,從而順利完成國旗計畫。

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

隨後n行,每行包含2個正整數。其中,第i行包含的兩個正整數ci、di分別表示i號邊防戰士常駐的兩個邊防站編號,ci號邊防站沿順時針方向至di號邊防站為他的奔襲區間。資料保證整個邊境線都是可被覆蓋的。

輸出資料僅1行,需要包含n個正整數。其中,第i個正整數表示i號邊防戰士必須參加的前提下至少需要多少名邊防戰士才能順利地完成國旗計畫。

樣例說明

若1號邊防戰士必須參加,1、2、4號邊防戰士可覆蓋整個邊境線,因此至少需要3名邊防戰士完成國旗計畫;同理,若2號邊防戰士或4號邊防戰士必須參加,也需要3名邊防戰士完成國旗計畫;若3號邊防戰士必須參加,則需要1、2、3、4號邊防戰士才能完成國旗計畫,因此至少需要4名邊防戰士。

資料範圍

對於40%的資料,n≤2000,m≤5000。

另有30%的資料,保證所有答案不超過100。

對於100%的資料,n≤2×105,m≤109,1≤ci,di≤m。

solution

把環複製一邊成為鏈

對於起點i,我要走到i+m

對於每乙個戰士,可以求出他接的下乙個最遠走到哪

把這兩個戰士連邊。

那麼所有點構成一棵樹,我相當於求它的第乙個到i+m的祖先

可以發現這是有單調性的,也就是孩子的答案一定比父親的答案深。

用個佇列維護可行的節點即可。

#include#include#include#include#include#include#define maxn 800005

using namespace std;

int n,m,head[maxn],ans[maxn],tot;

int deep[maxn],r,q[maxn];

struct nodes[maxn];

bool cmp(node a,node b)

for(int i=head[k];i;i=e[i].nex)

r--;

}int main()

sort(s+1,s+n*2+1,cmp);

int j=1;

for(int i=1;idfs(n+n,0,1);

printf("%d",ans[1]);for(int i=2;i<=n;i++)printf(" %d",ans[i]);

return 0;

}

SCOI2015 國旗計畫

演算法難度5,思維難度6,難度5 給定乙個長度為m mm的環,環上有m mm個點 1,m 1,m 1,m 以及n nn個互不包含的區間。要求對於每個區間求出,在必須選這個區間的前提下,能使得所有被選區間覆蓋整個環的最少區間數。1 n 2 1 05,m 10 91 le n le 2 times 10...

SCOI2015 國旗計畫

斷環為鏈,將環複製兩倍。用to i j 表示從點i出發,走 2 j 步能夠到達的最遠的 右端點qwq 的編號。注意為了方便判斷已經走了一圈了,我們最後一步先不要跳,只需要判斷當前右端點仍在i n之前即可。然後這個樣子的話,最後答案需要 1。如下 include include include inc...

SCOI2015 國旗計畫

bzoj luogu 先考慮破環為鏈 由於區間不包含,我們sort之後可以貪心的選左端點在當前右端點之前的最後乙個 然後預處理乙個倍增陣列,每次logn查一下 複雜度 o nlogn 空間兩倍,tot 1的r設為inf includeusing namespace std const int 4e5...