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

xiaoxiao2021-02-28  34

题意:

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; }

转载请注明原文地址: https://www.6miu.com/read-46382.html

最新回复(0)