[CC-XXOR]Chef and Easy Problem

[CC-XXOR]Chef and Easy Problem

题目大意:

给你一个长度为\(n(n\le10^5)\)的序列\(A(A_i<2^{31})\)\(m(m\le10^5)\)次询问,每次给定一个区间\([l,r]\),求使得\(\sum_{i=l}^r(A_i\oplus x)\)最大的\(x(x<2^{31})\)是多少。

思路:

按位考虑,如果这一位是\(1\)的数比较多那么就把\(x\)的这一位弄成\(0\),否则弄成\(1\)

源代码:

#include<cstdio>
#include<cctype>
inline int getint() {
	register char ch;
	while(!isdigit(ch=getchar()));
	register int x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return x;
}
const int N=1e5+1,B=31;
int a[N];
int sum[N][B];
int main() {
	const int n=getint(),q=getint();
	for(register int i=1;i<=n;i++) {
		const int x=getint();
		for(register int j=0;j<B;j++) {
			sum[i][j]=sum[i-1][j];
			if((x>>j)&1) sum[i][j]++;
		}
	}
	for(register int i=0;i<q;i++) {
		const int l=getint(),r=getint(),len=r-l+1;
		int x=0;
		for(register int i=0;i<B;i++) {
			if((sum[r][i]-sum[l-1][i])*2<len) x|=1<<i;
		}
		printf("%d\n",x);
	}
	return 0;
}
posted @ 2018-09-13 09:46  skylee03  阅读(284)  评论(0编辑  收藏  举报