SCOI2015 國旗計畫 可能是倍增

2021-09-28 23:44:52 字數 1209 閱讀 5702

題目

這個題要是真的打倍增就是思維僵化,莫得洗白。

如果把每個[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

j​an

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...