BZOJ 4245: [ONTAK2015]OR-XOR

要求or的值最大,从高位到低位贪心,高位尽量为0,所以要求优先满足高位每段的xor和都相等

转化为前缀和就是选出0的个数能否>=m

#include<cstdio>
using namespace std;
int vis[1000005];
long long a[1000005],Sum[1000005];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i=1; i<=n; i++){
		scanf("%lld",&a[i]);
		Sum[i]=Sum[i-1]^a[i];
	}
	long long ans=0;
	for (int i=62; i>=0; i--){
		int sum=0;
		for (int j=1; j<=n; j++)
			if (!vis[j] && (Sum[j]&(1ll<<i))==0) sum++;
		if (sum>=m && !(Sum[n]&(1ll<<i))){
			for (int j=1; j<=n; j++)
				if (Sum[j]&(1ll<<i)) vis[j]=1;
		}
		else ans|=1ll<<i;
	}
	printf("%lld\n",ans);
	return 0;
}

  

posted @ 2018-10-13 19:53  ~Silent  阅读(112)  评论(0编辑  收藏  举报
Live2D