傳送門
給你乙個長度為 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的字元以下面給出的格式表示乙...