NOIp2016十連測第五場T2 walk 題解

2021-08-21 11:57:30 字數 1467 閱讀 7253

傳送門

最近由於參加noi集訓,好久沒有更新部落格啦tot

正解要從第二種部分分思路想。這個思路為什麼是o(n

×max⁡(

w)

)o(n\times\max(w))

o(n×

max(w)

)的?因為每次求森林最長鏈時其實真正有用的點/邊並不多,而演算法將大量時間花費在了無用點(孤立點)上。如果找有用邊時順便記錄有用的點,那麼就只需要遍歷這些點。由於乙個數i

ii約數的上界是o(i

)o(\sqrt i)

o(i​

)的,所以總時間複雜度o

(max⁡(

w)32

)o(\max(w)^\frac 32)

o(max(w)

23​)

,當然實際複雜度比這個上界小很多。

#include

using

namespace std;

#define fe "walk"

#define fo(i,d,a) for(int i=a.f[d];i;i=a.nxt[i])

const

int n=

1000005

,n2=n<<1;

int n,ans[n]

,vis[n]

,mx,fn,cnt,a1;

struct qxx

intnw()

voidpb(

int a,

int b)

}to,e;

int s[n]

,t[n]

;intrd(

)voidop(

int v)

void

init()

;int

find

(int v,

int fa,

int chk)

}return b;

}void

doo(

int i,

int j)

}void

solve()

for(

int i1=i;i1<=mx;i1+

=i)fo

(j1,i1,to)

for(

int i1=i;i1<=mx;i1+

=i)fo

(j1,i1,to)

ans[a1]

=i;}

for(

int i=n;i;i--

)ans[i]

=max

(ans[i]

,ans[i+1]

);for(

int i=

1;i<=n;i++)op

(ans[i]),

putchar

('\n');

}int

main()

void

init()

}

Noi2016十連測第五場 二進位制的世界

1 include 2 include 3 include 4 include 5 include 6 using namespace std 7 define maxn 100005 8 define maxk 256 9int n,type,ans,sum,a maxn f maxk maxk ...

Noip2016十連賽day3 平均數

有一天,小a得到了乙個長度為n的序列。他把這個序列的所有連續子串行都列了出來,並對每乙個子串行都求了其平均值,然後他把這些平均值寫在紙上,並對它們進行排序,最後他報出了第k小的平均值。你要做的就是模仿他的過程。第一行兩個整數n,k,意義如題中所述。第二行n個正整數,即為小a得到的序列。一行乙個實數,...

bzoj十連測第二場 A 深邃

一棵樹每個節點有顏色。請將樹分成若干連通塊,使每個連通塊均包含黑點。最小化最大的連通塊的大小。看到雙最直接二分。二分了乙個k,接下來怎麼判定?設f i 表示以i為根的情況 1 f i 為正數,表示以i為根的子樹內除了i所在連通塊均合法,i所在連通塊包含黑點時i所處連通塊大小的最小值。2 f i 為負...