在這裡。
考慮m =n
−1
m=n-1
m=n−
1的情況,直接按結點編號大小排序,每次選最小的即可。
設s on
ison_i
soni
表示i
ii的兒子,那麼時間複雜度為
o (∑
i=1n
soni
log2s
oni)
\begino(\sum_^n})\end
o(i=1∑
nso
nilog2s
oni
)所以為o(n
log2n
)o(n\log_2^n)
o(nlog2n
)。當m=n
m=nm=
n時,這是一棵基環樹,基環樹的套路就是刪邊,然後按照上面的方法做一遍。
可以發現刪掉的邊一定在環上,所以並查集找環,然後暴力求最小的即可。
時間複雜度為o(n
2log2
n)
o(n^2\log_2^n)
o(n2
log2n
)。用了許多函式。。。
#include
#define n 5005
using
namespace std;
int n,m,ans[n]
,tot;
int s[n]
,c[n]
[n],fa[n]
,pt[n]
,p[n]
,vis[n]
;int la[n]
,ne[n<<1]
,to[n<<1]
,use[n<<1]
,cnt;
struct inin[n]
;void
dfs(
int x,
int fa)
voidbl(
int x,
int en)
vis[x]=1
;for
(int i=la[x]
;i;i=ne[i])if
(!vis[to[i]
]&&use[i]==0
)}void
addnew
(int x,
int y)
void
cancel
(int x,
int y)
void
recovery
(int x,
int y)
intfind
(int x)
void
copy()
void
comp()
else
if(s[j]
>ans[j]
)return
;return;}
void
disconnect
(int x,
int y)
intmain()
for(
int i=
1;i<=n;i++)if
(m==n-1)
else
else fa[rtx]
=rty;
} pt[
++pt[0]
]=tx;
cancel
(tx,ty);bl
(tx,ty)
;memset
(use,0,
sizeof
(use));
for(
int i=
1;i<=n;i++
) ans[i]
=n+1
;disconnect
(tx,ty)
;for
(int i=
1;i;i++)}
for(
int i=
1;i<=n;i++
)printf
("%d "
,ans[i]);
}
NOIP2018提高組D1T1 鋪設道路
題目描述 春春是一名道路工程師,負責鋪設一條長度為 n 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區域,一開始,第 i 塊區域下陷的深度為 d i 春春每天可以選擇一段連續區間 l,r 填充這段區間中的每塊區域,讓其下陷深度減少1。在選擇區間時,需要保證,區間內...
NOIP2018提高組初賽
在一條長度為 1 的線段上隨機取兩個點,則以這兩個點為端點的線段的期望長度是 1 3 frac13 31 解析 使用排除法解決問題,當左邊的點在左邊端點是,期望長度為1 2 frac12 21 所以答案一定小於1 2 frac12 21 為了統計乙個非負整數的二進位制形式中 1 的個數,如下 int...
NOIp2018 提高組遊記
上午請假,沒去學校,在家裡刷了十多道題,中午12點出發去杭州 16點到達賓館,和hsy,oyyj嘮了會兒嗑,開始刷模板 晚飯炸雞真香,和xjd學長聊了一會兒,又和鄒sir聊了一會兒,回顧了自己的部落格,22點準時睡覺 失眠了,22 00 02 00,我不知道我是怎麼度過的,作為提高萌新,真的有點緊張...