UNR 4 序列妙妙值 分塊 DP

2022-05-08 01:12:07 字數 1252 閱讀 3554

只會 80pts.  

最裸的暴力(40pts)   

令 $f[i][j]$ 表示當前 dp 到 $i$,劃分成了 $j$ 段的最小值.  

時間複雜度 $o(n^2)$   

一點優化(60 ~ 80pts) 

有幾個測點 $a[i]$ 很小,那麼可以直接開乙個桶 $s[i][j]$ 表示字首異或和為 $i$,且劃分 $j$ 段的最小值.   

修改複雜度:$o(1)$,查詢複雜度 $o(v)$,總複雜度 $o(nv)$.   

還可以在 $trie$ 樹上亂搞,不知道能拿多少分.   

正解分塊.   

我們發現 $60$ 分解法中查詢和修改複雜度差異很大,所以考慮用分塊去平衡上述複雜度.  

由於數字最大是 $2^$,所以考慮維護 $mi[x][y]$ 表示乙個數的前 $8$ 位是 $x$,去匹配乙個後 $8$ 位為 $y$ 的貢獻.  

那麼這個修改起來的話只需要列舉後面的 $y$,複雜度為 $o(\sqrt v)$.   

查詢的話後面是固定的,然後列舉前面的 $x$,複雜度為 $o(\sqrt v)$.  

總複雜度就是 $o(nk \sqrt v)$ 的.   

**: 

#include #include #include #define n 60009  

#define ll long long

#define setio(s) freopen(s".in","r",stdin)

using namespace std;

const int inf=1000000000;

int n,k;

int a[n],f[n],tmp[n],mi[300][300];

int main()

f[0]=0;

for(int i=1;i<=n;++i)

int b=(1<<8)-1;

for(int i=1;i<=k;++i)

for(int j=0;j<=n;++j)

for(int x=0;x<256;++x)

}

for(int j=0;j<=n;++j) f[j]=tmp[j];

}

for(int i=k;iprintf("%d",f[n]);

printf("\n");

return 0;

}

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

題意 給乙個長度為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 mi...

4 序列式容器

template class vector 成員函式舉例 注意其中的記憶體管理 void vector insert iterator position,size type n,const t x else else ifdef stl use exceptions catch endif stl ...

Python基礎 4序列總結

區別 列表 list 元組 tuple 字典 dictionary 字串 char 修改可以修改 不可修改 可以修改 可以修改 索引有索引 有索引無索引 有索引型別 相同型別 不同型別 任何型別 文字字元 場景普遍使用 特定場景 描述事物 多種方法 切片可以切片 可以切片 不可切片 可以切片 名稱基...