「CF1324A Yet Another Tetris Problem」

闲得无聊,发个位运算版题解,谔谔

题目大意

给出一个序列 (a),每次操作可以在任何一个元素加上 (2),问最后是否可以使得所有元素相等.

分析

可以发现最大值 (-) 当前位置要是一个偶数,那么再理解一下就是所有元素的奇偶性相同,那么可以维护一个 (and) 和,以及一个 (or) 和,最后看二进制最后一位就好了.

代码

#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
using namespace std;
int T,N;
void YES()
{
	printf("YES
");
}
void NO()
{
	printf("NO
");
}
void work()
{
	scanf("%d",&N);
	int and_=1,or_=0;//记录and和以及or和,初值为1和0
	int a;
	REP(i,1,N)
	{
		scanf("%d",&a);
		and_&=a&1;//因为用到的知识奇偶性所以可以直接在a上and1
		or_|=a&1;
	}
	if(and_||or_^1)//如果and最后为1(全是奇数),或者or最后为0(全是偶数),则输出YES
	{
		YES();
		return;
	}
	NO();//否则不成立
}
int main()
{
	scanf("%d",&T);
	REP(i,1,T)
	{
		work();
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Sxy_Limit/p/12484240.html