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

猜你喜欢

转载自www.cnblogs.com/Sxy_Limit/p/12484240.html