題目
這個題要是真的打倍增就是思維僵化,莫得洗白。
如果把每個[li
,ri]
[l_i,r_i]
[li,r
i],對於r
i>=l
jand
li
r_i >= l_j \ and \ l_i < l_j ri>=l jan dli 並且在此基礎上滿足r jr_j rj最大的j jj的(i, j) (i,j) (i,j )我們連邊(i, j) (i,j) (i,j ),我們把環拆成長度為2n2n 2n的鏈後這種連邊就會連出來一棵樹,那麼每個點i ii的答案就是祖先中最後乙個與i ii距離< =<= < =乙個環長的點與i ii在樹上的深度差。 所以解法一:樹上dfs+當前弧優化 o(n )o(n) o(n) 大佬** 解法二:排序求出樹上點反向拓撲序即可用並查集優化。 a cc od e\rm ac \ code accode#include
#define maxn 400005
using
namespace std;
int n,m,p,c[maxn]
,d[maxn]
,id[maxn]
,ans[maxn]
;bool
cmp(
const
int&u,
const
int&v)
int f[maxn]
,d[maxn]
;int
find
(int u)
intmain()
for(
int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++
)printf
("%d%c"
,ans[i]
," \n"
[i==n]);
}
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...