「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\n");
}
void NO()
{
printf("NO\n");
}
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;
}