異或序列 set優化DP

2022-02-27 05:19:03 字數 1797 閱讀 8783

也許更好的閱讀體驗

\(\mathcal\)

有乙個長度為 \(n\)的自然數序列 \(a\),要求將這個序列分成至少 \(m\) 個連續子段

每個子段的價值為該子段的所有數的按位異或

要使所有子段的價值按位與的結果最大,輸出這個最大值

\(t\)組詢問

\(t\leq 10,n,m\leq 1000,a_i\leq 2^\)

\(\mathcal\)

實際上資料範圍可開大很多

我們貪心的一位一位的確定最終答案,即看當前考慮的位能否為\(1\)

記\(s_i\)表示前\(i\)個數的異或和,\(\bigoplus\)表示異或

設當前考慮到了第\(b\)位

令\(res=ans|(1<

一段區間\([j+1,i]\)如果是乙個合法的區間,可以得到

\(\left(s_i\bigoplus s_j\right)\&res=res\)

於是我們得到了乙個\(n^2log\)的\(dp\)方程

\(f_i=max\)其中\(\left(s_i\bigoplus s_j\right)=res\)

列舉位是\(log\)的,這樣就可以\(ac\)此題了

實際這個\(dp\)可以進一步優化

\(\left(s_i\bigoplus s_j\right)\&res=res\)可以推出

\(\left(s_i \& res\right)\bigoplus \left(s_j\& res\right)=res\)

\(\rightarrow s_i \& res=\left(s_j\& res\right)\bigoplus res\)

即要將\(s_i\)到\(s_j\)這段作為乙個子段必須滿足上面的條件

因為題目是至少\(m\)段,所以分的越多越好

則我們可以考慮完\(s_i\)的最優答案後將\(s_i\bigoplus res\)作為第一關鍵字存進\(set\)

\(f_i=find(s_i\bigoplus res)\)

這樣一次轉移就是\(log\)的

複雜度為\(nlog^2\)

\(\mathcal\)

/*******************************

author:morning_glory

lang:c++

created time:2023年10月26日 星期六 09時18分19秒

*******************************/

#include #include #include #include #define mp make_pair

using namespace std;

const int maxn = 2003;

//}cin;

//}}}

int n,m,t,ans;

int a[maxn],s[maxn];

set < pair> v;

set < pair> :: iterator it,nx;

// if (it->second==0)

} else

} if (flag) ans=res;

}//}}}

int main()

for (int i=29;~i;--i) solve(i);

printf("%d\n",ans);

} return 0;

}

如有**講得不是很明白或是有錯誤,歡迎指正

如您喜歡的話不妨點個贊收藏一下吧

問題 A 異或序列

時間限制 1 sec 記憶體限制 128 mb 提交 188 解決 86 提交 狀態 討論版 命題人 admin 題目描述 已知乙個長度為n的整數數列a1,a2,an,給定查詢引數l r,問在al,al 1,ar區間內,有多少子串行滿足異或和等於k。也就是說,對於所有的x,y l x y r 滿足a...

6759A異或序列

題目描述 已知乙個長度為n的整數數列a1,a2,an,給定查詢引數l r,問在al,al 1,ar區間內,有多少子串行滿足異或和等於k。也就是說,對於所有的x,y l x y r 滿足ax ax 1 ay k的x,y有多少組。輸入輸入第一行為3個整數n,m,k。第二行為空格分開的n個整數,即a1,a...

異或的路徑 樹形DP

給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f u,v 表示 u 節點到 v 節點,路徑上邊權異或值。求 i 1n j 1nf i,j sum sum f i,j i 1n j 1n f i,j 結果對 1000000007 取模。第一行乙個整數 n n 100000 n n leq 100...