Luogu P10499 Solution

题面

这里

思路

\(1\le N\le 28\),考虑搜索。

将所有更改方式以及初始/结束状态压缩至一个 int 变量内。

直接搜索并不会被炸上天,在 C++20 O2 环境下用时 92ms。

代码

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, s, t, bt[N], x, y, trs, res;
void run()
{
    res = 0;
    scanf("%d", &n);
    s = t = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        s |= (x << i);
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        t |= (x << i);
        bt[i] = (1 << i);
    }
    while (scanf("%d%d", &x, &y), x or y)
    {
        bt[x - 1] |= (1 << (y - 1));
    }
    trs = (1 << n);
    for (int i = 0, tp; i < trs; i++)
    {
        tp = s;
        for (int j = 0; j < n; j++)
        {
            if (i & (1 << j))
                tp ^= bt[j];
        }
        res += (tp == t);
    }
    if (res)
        printf("%d\n", res);
    else
        puts("Oh,it's impossible~!!");
}
int main()
{
    int T = 1;
    scanf("%d", &T);
    while (T--)
        run();
}
posted @ 2024-06-26 14:04  丝羽绫华  阅读(5)  评论(0编辑  收藏  举报