題意:給乙個長度為n
nn的序列a
aa,將其分成k
kk段,不能為空,求所有段的異或和之和的最小值。
n ≤6
×104
,a
i<216
,k≤8
n\leq 6\times 10^4,a_i <2^,k\leq 8
n≤6×10
4,ai
<21
6,k≤
8 先求個字首異或和,顯然有個 dp:
f (n
,k)=
mini=
k−1n
−1
f(n,k)=\min_^\
f(n,k)
=i=k
−1minn−1
發現值域很小,可以在跑的時候順便維護前面的每個ai=
va_i=v
ai=v的i
ii中f(i
,k−1
)f(i,k-1)
f(i,k−
1)的最小值,複雜度o(n
vk
)o(nvk)
o(nvk)
,就能拿到 60 分的好成績。
考慮優化。這個演算法是詢問o(v
)o(v)
o(v)
,修改o(1
)o(1)
o(1)
的,在修改的時候暴力預處理所有最小值可以做到詢問o(1
)o(1)
o(1)
,修改o(v
)o(v)
o(v)
,不難想到根號分治。
修改的時候暴力後8
88位,查詢的時候暴力前8
88位,就可以做到o(v
)o(\sqrt v)
o(v)
總複雜度o(k
nv
)o(kn\sqrt v)
o(knv
) 我好菜啊……
#include
#include
#include
#include
#define maxn (1<<16)+5
#define maxm (1<<8)+5
using
namespace std;
int a[maxn]
,f[10
][maxn]
;int mn[10]
[maxm]
[maxm]
;int
main()
for(
int i=k;i<=n;i++
)printf
("%d "
,f[k]
[i])
;return0;
}
UNR 4 序列妙妙值 分塊 DP
只會 80pts.最裸的暴力 40pts 令 f i j 表示當前 dp 到 i 劃分成了 j 段的最小值.時間複雜度 o n 2 一點優化 60 80pts 有幾個測點 a i 很小,那麼可以直接開乙個桶 s i j 表示字首異或和為 i 且劃分 j 段的最小值.修改複雜度 o 1 查詢複雜度 o...
30 序列構造
給定兩個長度為 n 的正整數序列 a a1,a2,an 和 b b1,b2,bn 現在你選擇 k 個數構成序列 p p1,p2,pk 使得 序列 p 中的元素是不重複的1 pi n 其中1 i k2 ap1 a pk 大於序列 a 所有元素的和2 bp1 b pk 大於序列 b 所有元素的和 k 小...
192220序列型別
序列表示索引未非負整數的有序物件集合,包括字串,列表,元祖。說明 舉例 元祖跟裡面的逗號相關 mytuple a b c d type mytuple 列表根中括號相關 mylist a b c d type mylist 字串跟雙引號有關 mystr a,b,c,d type mystr 適用於所...