也許更好的閱讀體驗
\(\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...