2019 07 25測試 T1 中位數

2021-09-25 14:08:36 字數 2107 閱讀 6102

傳送門

給你乙個長度為 n

nn 的正整數序列

\,它包含 (2n

−1

)(2^n−1)

(2n−1)

個非空子序列,注意到 (2n

−1

)(2^n−1)

(2n−1)

是乙個奇數。

我們定義乙個子串行的權值為子串行內所有元素權值之和,求所有非空子序列的權值的中位數。

資料範圍:1≤n

≤2000

1≤n≤2000

1≤n≤20

00,1 ≤a

i≤

2000

1≤a_i≤2000

1≤ai​≤

2000

。我們暫且將空序列納入考慮範圍,這樣我們會發現子串行的權值具有一種對稱性。

具體來說,記所有元素的權值和為 sum

sumsu

m。我們發現,對於任意乙個權值為 x

xx(x≤⌊

sum2

⌋x\le \lfloor \frac 2\rfloor

x≤⌊2su

m​⌋)的子串行,都存在另乙個權值為 sum

−x

sum-x

sum−x(sum

−x≥⌊

sum2

⌋sum-x≥\lfloor \frac 2\rfloor

sum−x≥

⌊2su

m​⌋)的子串行。這很顯然。

可以看出,⌊su

m2

⌋\lfloor \frac 2\rfloor

⌊2sum​

⌋ 是乙個分隔線,每當乙個權值在其本身或左邊的子串行,就存在乙個權值在其本身或右邊的子串行。那麼答案應該就在 ⌊su

m2

⌋\lfloor \frac 2\rfloor

⌊2sum​

⌋ 附近。仔細想一想,除去空序列後最小的、大於等於 ⌈su

m2

⌉\lceil \frac 2\rceil

⌈2sum​

⌉ 的子串行權值就是答案。

於是現在的問題就是怎麼求這個值了。

我們設 f[i

][j]

f[i][j]

f[i][j

] 表示前 i

ii 個數組成的權值為 j

jj 的子串行是否存在。

那麼有乙個顯然的轉移:f[i

][j]

=(f[

i−1]

[j])

∣(f[

i−1]

[j−a

i]

)f[i][j]=(f[i-1][j])|(f[i-1][j-a_i])

f[i][j

]=(f

[i−1

][j]

)∣(f

[i−1

][j−

ai​]

),ai

a_iai

​ 為第 i

ii 個數的權值。

考慮到第一維只與 i

ii 和 i−1

i-1i−

1 有關,可以優化掉。

又由於每次轉移都是偏移一段距離後進行或操作,可以使用 bit

se

tbitset

bitset

優化時空複雜度。

時間複雜度 o(n

×sum

64)

o(\frac)

o(64n×

sum​

),常數極小,可以通過本題。

#include

#include

#include

#include

#define n 2005

using

namespace std;

bitsetf;

intmain()

for(

int i=

(sum+1)

/2;i<=sum;

++i)

if(f[i]

)return

printf

("%d"

,i),0;

return0;

}

2018 10 20測試T1 蛋糕

內網傳送門 外網傳送門 我們先對於 a 排序,然後對於 b,其實就是求上公升序列最少有多少個 還是乙個很常見的模型吧,記錄乙個陣列,每次加入乙個點的時候,就找它前驅的位置,更新一下就可以了 然後求它屬於哪個蛋糕就直接再開乙個陣列記錄一下 應該是一道水題吧。include include includ...

2018 10 16測試T1 膜法

內網傳送門 外網傳送門 做這道題之前,先儲備一些關於組合數的知識吧 c nm cnn m c n m c n cnm c nn m cn m cn 1m cn 1 m 1c n m c m c cnm c n 1m cn 1m 1 c n0 cn1 cn2 cnn 2 nc n 0 c n 1 c ...

2018 9 4南海中學測試T1

田野上搭建了乙個 大神專用的柵欄圍成的迷宮。幸運的是,在迷宮的邊界上留出了兩段柵欄作為迷宮的出口。更幸運的是,所建造的迷宮是乙個 完美的 迷宮 即你能從迷宮中的任意一點找到一條走出迷宮的路。給定迷宮的寬w 1 w 38 及長h 1 h 100 2 h 1行,每行2 w 1的字元以下面給出的格式表示乙...