BJOI2019 奧術神杖

2021-09-28 16:32:21 字數 2061 閱讀 5045

傳送門

首先w1w2

w3⋯w

nn

\sqrt[n]

nw1​w2

​w3​

⋯wn​

​可以利用對數轉化:

l og

2w1w

2w3⋯

wnn=

1n∑l

og2w

ilog_2}=\frac\sum log_2\ w_i

log2​n

w1​w

2​w3

​⋯wn

​​=n

1​∑l

og2​

wi​那麼令ti=

log2

wi

t_i=log_2\ w_i

ti​=lo

g2​w

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

print

(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 式,移...