斷環為鏈,將環複製兩倍。
用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 這段區間這個給定的區間是必須選擇的,於是我們...