高維字首和學習小記
問題引入:
現有a[i](0<=i<2n)
對於每一i,求∑j∈ia[j]
這裡的∈指二進位制狀態下的被包含。
暴力解決問題:
即暴力列舉子集求和。
複雜度計算:
∑i=0nCni∗2i
=∑i=0nCni∗2i∗1n−i
=(1+2)n
動態規劃:
考慮對於一個i,列舉把一個0變成1,轉移上去。
但是這樣顯然會有重。
比如說i=0
第一輪加上20,第二輪加上了21
也可以第一輪加上21,第二輪加上20
這樣就會重複。
那麼考慮使增加的1的位置遞增的。
設fi,j表示到i了,上一次增加的1是第j位上的。
那麼列舉k((k>=j)and(i的第k位是0)),f(i∣2k,k)+=
這樣的複雜度是O(2n∗n2)
對於上面的式子可以字首和優化:
即f(i,j)+=f(i,j−1),f(i∣2j,j)+=f(i,j)(i的第j位是0)
複雜度O(2n∗n)
正題:
把上述問題看作一個n維空間,每一維座標的範圍是[0..1],求字首和。
考慮二維暴力是怎麼做的(不差分)?
先一行一行的掃描,記錄下來和,然後再一列一列的掃描。
高維同理,就是一維一維的掃描。
下面給出程式碼實現:
fo(j, 0, N - 1) fo(i, 0, (1 << N) - 1)
if(i >> j & 1) a[i] += a[i ^ (1 << j)];
複雜度O(2n∗n)
相關推薦
高維字首和學習小記
問題引入: 現有a[i](0<=i<2n)a[i](0<=i<2^n)a[i](0<=i<2n) 對於每一iii,求∑j∈ia[j]\sum_{j∈i}a[j]∑j∈ia[j] 這裡的∈∈∈指
BZOJ:5092 [Lydsy1711月賽]分割序列(貪心&高維字首和)
Description 對於一個長度為n的非負整數序列b_1,b_2,...,b_n,定義這個序列的能量為:f(b)=max{i=0,1,...,n}((b_1 xor b _2 xor...xor b_i)+(b_{i+1} xor b_{i+2} xor...xor b_n))
HihoCoder - 1496:尋找最大值(高維字首和||手動求子集)
描述 給定N個數A1, A2, A3, ... AN,小Ho想從中找到兩個數Ai和Aj(i ≠ j)使得乘積Ai × Aj × (Ai AND Aj)最大。其中AND是按位與操作。 小Ho當然知道怎麼做。現在他想把這個問題交給你。 輸入 第一行
牛客網 NOIP賽前集訓營-普及組(第四場)C--部分和 (高維字首和)
傳送門 解題思路 高維字首和模板題。首先,求字首和有兩種方式,比如說對於求二維字首和來說。 第一種 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-s
高維字首和
高維字首和就是求關於一個集合子集(或超集)的狀態的和 牛客有一道題寫的很好 傳送門 題面就已經說明了高維字首和的原理 連結:https://ac.nowcoder.com/acm/contest/167/C 來源:牛客網 對於一個一維陣列求部分和,可以使用如下程式碼 for
bzoj 5092 分割序列 —— 高維字首和
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 首先,處理出異或字首和 s[i],i 位置的答案就是 s[j] + s[j]^s[i],j <= i 異或的套路是按位考慮,但是這裡有加法...怎麼考慮進位? 所以就不能考慮答案的這一
bzoj 5092 [Lydsy1711月賽]分割序列——高維字首和
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一個字首異或和,就變成 f[ i ]=max_{j=0}^{i} { s[ j ] + (s[ i ]^s[ j ]) }。再套路地考慮按位貪心。 然後看了題解。按位貪心不是確定 f[
SPOJ.TLE - Time Limit Exceeded(DP 高維字首和)
題目連結 \(Description\) 給定長為\(n\)的陣列\(c_i\)和\(m\),求長為\(n\)的序列\(a_i\)個數,滿足:\(c_i\not\mid a_i,\quad a_i\&a_{i+1}=0\)。 \(n\leq 50,m\leq 15,0\leq a_i<2^m
[JZOJ5952] 凱旋而歸 ([BZOJ 5092]【Lydsy1711月賽】分割序列)【高維字首和】【DP】
Description 對於一個長度為m的序列a,記 f ( a
BZOJ5092:[Lydsy1711月賽]分割序列(貪心,高維字首和)
Description 對於一個長度為n的非負整數序列b_1,b_2,...,b_n,定義這個序列的能量為:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b_i)+(b_{i+1} xor b_{i+2} xor...xor b_n))其中xor表示按
luoguP3175 [HAOI2015]按位或 min-max容斥 + 高維字首和
考慮min-max容斥 \(E[max(S)] = \sum \limits_{T \subset S} min(T)\) \(min(T)\)是可以被表示出來 即所有與\(T\)有交集的數的概率的和的倒數 通過轉化一下,可以考慮求所有與\(T\)沒有交集的數的概率和 即求\(T\)的補集的
hihocoder1496-高維字首和|暴力
http://hihocoder.com/problemset/solution/1115709 其實我感覺高維字首本身也是一種暴力(遞推???)。。。 因為&操作不會使1的數量增加,所以我
Time Limit Exceeded(高維字首和)
題意 題目連結 題目的意思是給一個數組C,長度為n,每個數字的範圍是2^m,然後要求構造一個數組a,滿足 1、a[i] % C[i] !=0 ; 2、a[i] < 2^m ; 3、a[i] & a[i+1] = 0; Sol 直接dp的話就是先列舉補集的子集,這樣的複雜度是\(3
cf449D. Jzzhu and Numbers(容斥原理 高維字首和)
題意 題目連結 給出\(n\)個數,問任意選幾個數,它們\(\&\)起來等於\(0\)的方案數 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到。。 考慮每一種方案 答案=任意一種方案 - 至少有\(1\)位為\(1\)的方案 + 至少有兩位為\(1\)的方案 - 至少有三位為\(1\)的方案
【高維字首和】SPOJ(TLE)[Time Limit Exceeded]題解
題目概述 題目名稱要不要這麼奇葩而且和題面沒有半毛錢關係啊,我上交題目都以為自己TLE了。 給出 nn 個數 cici ,現在需要構造 aiai 使得: aimodci>0aimodci&
第一類斯特林數求自然數冪和學習小記
目標 求∑i=0nik 前置技能 第一類斯特林數 第一類斯特林數s(n,m)定義為有n個人,編號分別為1-n,排成m個迴圈排列的方案數。 遞推式:s(n,m)=s(n−1,m−1)+(n−
5765 Bonds 高維字首和
這題做了好久,,看了網上的題解也看不太懂,,只知道用高維字首做,,,,,,然後在拉粑粑的時候,,突然想出了一種方法 他是要算出每條邊出現在多少割集中,,,我們可以反著想,,我們可以先算出有多少割集(個數設為sum),在算出這條邊包含多少合法聯通塊中(個數設為x),,然後s
TLE Time Limit Exceeded 高維字首和
題意:給出長度為n的序列c,求非負整數序列a,滿足a<2^m,並且有a[i]&a[i+1]=0,對於每個a[i],要保證a[i]不是c[i]的倍數,求這樣的a[i]序列的個數 思路:d
Python學習之圖片對比和識別小記
因工作中需要對視訊圖片做處理,於是就把應用得到的幾個需求功能在網上solo了一波。 一、圖片對比 主要應用的庫Image,函式Image.size(),resize(),convert(),getpixel(), 1、根據R-G -B三原色原理: 只要使R=G=B,三者的值相等就可以
JAVAEE顛覆者,SpringBoot實戰一書學習小記(Bean的Scope,Bean的動態注入,Bean初始化和銷燬)
Bean的Scope每一個bean可以新增Scope標籤來設定個人理解從此看出Spring的控制反轉預設一直都在用一個例項注入1.Singleton 一個Spring容器中只有一個Bean的例項,此為Spring的預設配置,全容器共享一個例項。2.Prototype 每次呼叫