码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ4245 : [ONTAK2015]OR-XOR

时间:2015-08-19 19:31:33      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:

按位考虑,逐步确定答案。

设当前是第i位,求出第i位的前缀异或和。

若存在m个0且所有数字异或和为0,那么答案的这一位可以为0,并把所有1的位置给标记为不可选。

否则答案的这一位只能是1。

时间复杂度$O(n\log n)$。

 

#include<cstdio>
#define N 500010
int n,m,i,j,t,b[N],f[N];long long a[N],ans;
inline void read(long long&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
int main(){
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)read(a[i]),f[i]=1;
  for(i=58;~i;i--){
    for(t=0,j=1;j<=n;j++){
      b[j]=b[j-1]^(a[j]>>i&1);
      if(!b[j]&&f[j])t++;
    }
    if(t>=m&&!b[n]){for(j=1;j<n;j++)if(b[j]&&f[j])f[j]=0;}else ans|=1LL<<i;
  }
  return printf("%lld",ans),0;
}

  

BZOJ4245 : [ONTAK2015]OR-XOR

标签:

原文地址:http://www.cnblogs.com/clrs97/p/4742894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!