UOJ549 序列妙妙值 異或 根號分治

2021-10-10 00:03:54 字數 1387 閱讀 9959

題意:給乙個長度為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)=

min⁡i=

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 適用於所...