题解 P2114 【[NOI2014]起床困难综合症】

· · 题解

看见别的大佬的代码我都自卑了

于是我来写一篇我看得懂的emmm

大概思路呢是:

模拟bàolì

int Ans[i][2];//用这玩意儿来存最后攻击力(二进制下)第i为是0还是1

So 这个需要初始化:


    Max = log2(M);
    for (int i = 0; i <= Max; ++i)Ans[i][1] = 1;//i的最大值是log2(M)

然后暴力(只会暴力emmmmm):


#define Work(X) for (int i(0); i < 31; ++i)\
                {                               \
                    Ans[i][0] = Ans[i][0] X T%2,\
                    Ans[i][1] = Ans[i][1] X T%2;\
                    if (T)T >>= 1;              \
                }   
    //万恶的宏,确实是挺好用的
    ...
    for (int i(0); i < N; ++i)
    {
        scanf("%s %d", Opt, &T);
        if (Opt[0] == 'A')Work(&)
        else if(Opt[0] == 'O')Work(|)
        else if(Opt[0] == 'X')Work(^)
    }

CodeTime

#include <stdio.h>
#include <math.h>
#define Work(X) for (int i(0); i < 31; ++i)\
                {                               \
                    Ans[i][0] = Ans[i][0] X T%2,\
                    Ans[i][1] = Ans[i][1] X T%2;\
                    if (T)T >>= 1;              \
                }

int N, M, T, Max, Temp(1), Sum;
int Ans[35][2];
char Opt[10];

int main()
{
    scanf("%d %d", &N, &M);
    Max = log2(M);
    for (int i = 0; i <= Max; ++i)Ans[i][1] = 1;
    for (int i(0); i < N; ++i)
    {
        scanf("%s %d", Opt, &T);
        if (Opt[0] == 'A')Work(&)
        else if(Opt[0] == 'O')Work(|)
        else if(Opt[0] == 'X')Work(^)
    }
    for (int i = 0; i < 31; ++i, Temp <<= 1)
        if (Ans[i][1] || Ans[i][0])Sum += Temp;//如果最后是1,不管是谁都加了
        //这还能通过Ans数组找到最开始的那些数字呢
    printf("%d\n", Sum);
}