傳送門
首先w1w2
w3⋯w
nn
\sqrt[n]
nw1w2
w3
⋯wn
可以利用對數轉化:
l og
2w1w
2w3⋯
wnn=
1n∑l
og2w
ilog_2}=\frac\sum log_2\ w_i
log2n
w1w
2w3
⋯wn
=n
1∑l
og2
wi那麼令ti=
log2
wi
t_i=log_2\ w_i
ti=lo
g2w
i,問題就轉化為了:
m ax
imiz
e:∑t
i∑
1maximize:\frac}}
maximi
ze:∑
1∑ti
也就是乙個分數規劃:二分λ
\lambda
λ,權值轉化為ti−
λt_i-\lambda
ti−
λ。由於求最大值,那麼:
如果最大的和小於0
00,說明λ
>an
s\lambda>ans
λ>an
s,則r=m
id
r=mid
r=mi
d。(減的多了)
如果最大的和大於0
00,說明λ
s\lambda λs,則l=m id l=mid l=mi d。(減的少了) 在a cac ac自動機上dpdp dp出最大值即可。 d p[ i][j ]dp[i][j] dp[i][ j]表示當前填到了原串的第i ii位,處於自動機上的第j jj位的和的最大值。#include
#define re register
#define cs const
cs int n=
2010
,maxs=
2010
;cs double eps=
1e-5
;int n,m;
char s[n]
,spell[maxs]
;double w;
namespace aca[maxs]
;inline
void
insert
(char
*s,double v)
a[now]
.val=v,a[now]
.num+=1
;}inline
void
build_fail()
}}inline
bool
check
(double x)
else
}for
(int i=
0;i<=tot;
++i)
if(dp[n]
[i]>0)
return
true
;return
false;}
inline
void
(int l,
int pos)
inline
void
solve()
check
(l);
for(
int i=
0;i<=tot;
++i)
if(dp[n]
[i]>0)
}}using ac::insert;
intmain()
BJOI2019 奧術神杖
傳送門 根據題意,需要知道神杖所包含了哪些咒語,大可使用自動ac自動機。關鍵是如何處理 sqrt c 這其實也很套路,一眼看過去,覺得根號這個東西顯然就不可做,於是想辦法消去根號。於是對於這個式子取對數,sqrt c frac magic v 1 v 2 v n 對於 frac 這種形式的答案,很顯...
題解 BJOI2019 奧術神杖
題目傳送門 給出乙個殘缺的字串,每個位置都 in 0,9 有 m 中貢獻,即 s,k 表示該字串中沒出現一次 s 貢獻便乘上 k 最後對貢獻求 c 次根,其中 c 是總出現次數。求貢獻的最大值。字串長度以及貢獻字串長度之和 le 1500 首先你需要想到我們可以全部取 ln 然後每次貢獻就是 k 求...
BJOI2019 光線 遞推
題目鏈結 令 f i 表示光線第一次從第一塊玻璃射出第 i 塊玻璃的比率。令 g i 表示光線射回第 i 塊玻璃,再射出第 i 塊玻璃的比率。容易得到 beginf i f a i f b ig i g i b a i b b ig i a g a i a g b ig i end 對於 2 式,移...