BZOJ 3687: 簡單題(dp+bitset)
阿新 • • 發佈:2019-02-13
.com 枚舉 problem using 當前 lin 思路 \n amp
傳送門
解題思路
設\(f(i)\)表示和為\(i\)時的方案數,那麽轉移方程為\(f(i)+=f(i-x)\),\(x\)為當前枚舉到的數字,這樣做是\(O(n\sum a_i)\)的,考慮優化。發現最後要的並不是方案數,最後的奇偶性,那麽轉移方程轉化為\(f(i)^=f(i-x)\),這樣可以用\(bitset\)優化,時間復雜度\(O(\frac{n \sum a_i}{32})\)。
代碼
#include<iostream> #include<cstdio> #include<bitset> using namespace std; const int N=2000005; int n,sum,ans; bitset<N> f; int main(){ scanf("%d",&n); int x; f[0]=1; for(int i=1;i<=n;i++) { scanf("%d",&x); sum+=x; f=(f^(f<<x)); } for(int i=1;i<=sum;i++) if(f[i]) ans^=i; printf("%d\n",ans); return 0; }
BZOJ 3687: 簡單題(dp+bitset)