SCOI2015 國旗計畫

2022-03-03 16:38:33 字數 853 閱讀 6658

斷環為鏈,將環複製兩倍。

用to[i][j]表示從點i出發,走\(2^j\)步能夠到達的最遠的(右端點qwq)的編號。

注意為了方便判斷已經走了一圈了,我們最後一步先不要跳,只需要判斷當前右端點仍在i+n之前即可。然後這個樣子的話,最後答案需要+1。

**如下:

#include#include#include#include#include#define maxn 400010

using namespace std;

int n,m;

int to[maxn][22];

struct nodet[maxn];

inline bool cmp(struct node x,struct node y)

inline bool cmp1(struct node x,struct node y)

int main()

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

sort(&t[1],&t[n*2+1],cmp);

int pos=1;

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

for(int j=1;j<=21;j++)

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

to[i][j]=to[to[i][j-1]][j-1];

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

}t[i].ans=cur_ans;

}sort(&t[1],&t[2*n+1],cmp1);

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

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 國旗計畫

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

SCOI2015 國旗計畫

題目 首先考慮一下環形的區間覆蓋問題怎麼做 我們可以把環倍長成鏈,之後驚訝的發現我只會列舉乙個 i 作為起點跑 i,i m 的區間覆蓋 看起來非常垃圾,但是會這樣做就夠了 考慮列舉到的這個 i 作為乙個某乙個給定的區間的左端點的時候,想要覆蓋 i,i m 這段區間這個給定的區間是必須選擇的,於是我們...