1592E - Скучающий Бакри
生活随笔
收集整理的這篇文章主要介紹了
1592E - Скучающий Бакри
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先把那式子轉換成長度為偶數并且二進制有一段連續的一,大于這位的數量都是偶數
如果長度為奇數那么如果 and 是1,xor 一定是1;and 是0,xor可能是1;所以長度為奇數一定不可以。
那么長度為偶數的話,對二進制的每位來說,and = 0,xor = 1? ?; and = 1/0?,xor=0;
兩個數的大小是由最高不同位確定的,那么假設 二進制第 i位不同,那么上面的要相同則 只有xor = and 0? ,所以有偶數個1? ?和第 i 位都是 1 ;
二進制有一段連續的一,大于這位的數量都是偶數? - > 大于 這位的前綴?prexor【r】= prexor【l-1】?
?
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<map> using namespace std;typedef long long LL; typedef pair<int,int> PII; const int N=1e6+10,mod=1e9+7;void add(int &a,LL b){a=(a+b)%mod;return ;} int sum[N]; int pos[2][N],pre[N],a[N]; int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);int ma=0;for(int i=20;i>=0;i--){for(int j=1;j<=n;j++)pre[j]=pre[j-1]^(a[j]>>(i+1)),pos[j&1][pre[j-1]]=n+1;for(int r=1;r<=n;r++)if(a[r]>>i&1){if(pos[(r-1)&1][pre[r]])ma=max(ma,r-pos[(r-1)&1][pre[r]]+1);pos[r&1][pre[r-1]]=min(pos[r&1][pre[r-1]],r);}else {for(int k=r-1;a[k]>>i&1;k--)pos[k&1][pre[k-1]]=n+1;}}printf("%d\n",ma);return 0; } //那個式子轉換下就是l-r,長度為偶數,二進制其中一位都是 1 ,并且 大于這位的1的數量是偶數 //假設連續一的位數是二進制的第i位 則 l-r中 i+1,i+2 -> 20 的異或是0;那就是pre[r]=pre[l-1]; //然后維護一段一,如果不是一段1的話就消去這段一的影響總結
以上是生活随笔為你收集整理的1592E - Скучающий Бакри的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树上启发式合并 简单例题
- 下一篇: 《虚拟化安全解决方案》一2.2 配置VM