欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU 6186 && 2017广西邀请赛:CS Course

程序员文章站 2022-06-04 15:36:26
...

HDU 6186 && 2017广西邀请赛:CS Course


题意:

n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和


统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1

之后每次查询只要check一下z[]就好


#include<stdio.h>
#include<string.h>
int a[100005], z[32];
int main(void)
{
	int n, q, p, i, j, ans;
	while(scanf("%d%d", &n, &q)!=EOF)
	{
		memset(z, 0, sizeof(z));
		for(i=1;i<=n;i++)
			scanf("%d", &a[i]);
		for(i=1;i<=n;i++)
		{
			for(j=0;j<=30;j++)
			{
				if(a[i]&(1<<j))
					z[j]++;
			}
		}
		while(q--)
		{
			scanf("%d", &p);
			ans = 0;
			for(i=0;i<=30;i++)
			{
				if(z[i]==n || z[i]==n-1 && (a[p]&(1<<i))==0)
					ans |= (1<<i);
			}
			printf("%d", ans);
			ans = 0;
			for(i=0;i<=30;i++)
			{
				if(z[i]>=2 || z[i]==1 && (a[p]&(1<<i))==0)
					ans |= (1<<i);
			}
			printf(" %d ", ans);
			ans = 0;
			for(i=0;i<=30;i++)
			{
				if(z[i]%2==0 && a[p]&(1<<i) || z[i]%2 && (a[p]&(1<<i))==0)
					ans |= (1<<i);
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}

相关标签: hduoj