NOIP2018提高組D2T1 旅行 題解

2021-10-17 12:14:16 字數 2059 閱讀 9939

在這裡。

考慮m =n

−1

m=n-1

m=n−

1的情況,直接按結點編號大小排序,每次選最小的即可。

設s on

ison_i

soni

​表示i

ii的兒子,那麼時間複雜度為

o (∑

i=1n

soni

log⁡2s

oni)

\begino(\sum_^n})\end

o(i=1∑

n​so

ni​log2s

oni​

​)​所以為o(n

log⁡2n

)o(n\log_2^n)

o(nlog2n

​)。當m=n

m=nm=

n時,這是一棵基環樹,基環樹的套路就是刪邊,然後按照上面的方法做一遍。

可以發現刪掉的邊一定在環上,所以並查集找環,然後暴力求最小的即可。

時間複雜度為o(n

2log⁡2

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,我不知道我是怎麼度過的,作為提高萌新,真的有點緊張...