bzoj3687 簡單題 bitset優化揹包

2021-08-20 17:52:43 字數 1190 閱讀 8135

給定乙個總和不大於2e6的數集,求子集的算術和的異或和。

好像可以直接上01揹包dp。但是會tle。

其實記錄的只是每個體積的狀態的奇偶,所以方程可以寫成dp

[i]=

dp[i

]⊕dp

[i−x

] dp[

i]=d

p[i]

⊕dp[

i−x]

,然後發現每乙個點都是異或上前面一定距離的數,所以我們可以把整個陣列往後移動x個然後和原陣列異或。可以用bitset優化(雖然看起來時間複雜度是一樣的但是用bitset就是會快一些,我也不知道為什麼。。。)

bitset的第一道題目,發現這確實是乙個神奇的東西。

/*********************====

* author : ylsoi

* problem : bzoj3687

* algorithm : bitset

* time : 2018.6.13

* ********************=*/

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

void file()

template

bool chkmax(t &_,t __)

template

bool chkmin(t &_,t __)

#define rep(i,a,b) for(register int i=a;i<=b;++i)

#define drep(i,a,b) for(register int i=a;i>=b;--i)

#define mrep(i,x) for(register int i=beg[x];i;i=e[i].last)

#define mem(a) memset(a,0,sizeof(a))

#define ll long long

#define inf int_max

const

int maxn=2e6+10;

bitset

dp;int n,ans;

int main()

bzoj3687簡單題 dp bitset優化

time limit 10 sec memory limit 512 mb submit 861 solved 399 submit status discuss 小呆開始研究集合論了,他提出了關於乙個數集四個問題 1 子集的異或和的算術和。2 子集的異或和的異或和。3 子集的算術和的算術和。4 子...

BZOJ2683 簡單題 題解

1.若n比較小,則可以用二維的樹狀陣列或線段樹來做,但是500000,空間開不下,於是考慮離線cdq。子矩陣的數字和表示為也就是二維字首和,因此乙個要查詢的子矩陣,對其有影響的矩陣為s x2 y2 s x2 y1 1 s x1 1 y2 s x1 1 y1 1 這四個字首子矩陣 所以,在沒有修改操作...

bzoj4915 簡單的數字題

傳送門 題解 出自第52屆imo試題第1題。首先第一問一定是4 樣例給你了啊 如果要你證明,我們不妨令a123 4那麼有s a1 a2 a3 a4 s 2 a1 2 a2 2 a3 2 a4 2 那麼有a3 2 a4 2 a3 2 a4 2 a1 2 a2 2 a3 2 a4 2 s 2,即a3 a...