傳送門
最近由於參加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 為負...