bzoj
luogu
先考慮破環為鏈
由於區間不包含,我們sort之後可以貪心的選左端點在當前右端點之前的最後乙個
然後預處理乙個倍增陣列,每次logn查一下
複雜度\(o(nlogn)\)
空間兩倍,tot+1的r設為inf
#includeusing namespace std;
const int _=4e5+5;
int re()
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}int n,m,tot,ans[_],f[20][_];
struct nodes[_];
bool cmp(node a,node b);
else s[i]=(node),s[++tot]=(node);
}sort(s+1,s+tot+1,cmp);s[0].r=s[tot+1].r=2e9+1;
for(int i=1,j=1;i<=tot;i++)
for(int i=1;i<=18;i++)
for(int j=1;j<=tot;j++)
f[i][j]=f[i-1][f[i-1][j]];
for(int i=1;i<=n;i++)
ans[s[i].id]=solve(i,s[i].l+m);
for(int i=1;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 國旗計畫
題目 首先考慮一下環形的區間覆蓋問題怎麼做 我們可以把環倍長成鏈,之後驚訝的發現我只會列舉乙個 i 作為起點跑 i,i m 的區間覆蓋 看起來非常垃圾,但是會這樣做就夠了 考慮列舉到的這個 i 作為乙個某乙個給定的區間的左端點的時候,想要覆蓋 i,i m 這段區間這個給定的區間是必須選擇的,於是我們...