給定乙個總和不大於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...