求助暴力喵
查看原帖
求助暴力喵
448881
PTqwq楼主2024/11/1 19:14
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;
using u64 = unsigned long long;

namespace PTqwq {
    const i64 inf = 2147483647;

    int n, m, c[100010], D[20][131082], cnt[20];
    i64 a[131082], val[131082];

    i64 dfs(int l, int r, int k) {
        if (l == r) {
            return l;
        }
        int mid = (l + r) / 2;
        int ls = dfs(l, mid, k - 1);
        int rs = dfs(mid + 1, r, k - 1);
        cnt[k] ++;
        if (D[k][cnt[k]] == 0) {
            if (val[ls] >= k) {
                return ls;
            } else {
                return rs;
            }
        } else {
            if (val[rs] >= k) {
                return rs;
            } else {
                return ls;
            }
        }
    }

    i64 query(int pre) {
        int k = 0;
        while ((1 << k) < pre) k ++;
        i64 sum = 0;
        for (int i = 1; i <= (1 << k); ++ i) {
            for (int j = 1; j <= (1 << k); ++ j) {
                if (j <= pre) {
                    val[j] = a[j];
                } else {
                    if (i == j) {
                        val[j] = inf;
                    } else {
                        val[j] = 0;
                    }
                }
            }
            for (int j = 0; j <= k + 1; ++ j) cnt[j] = 0;
            if (dfs(1, (1 << k), k) == i) {
                sum += i64(i);
            }
        }
        return sum;
    }

    void solve() {
        i64 X[4];
        cin >> X[0] >> X[1] >> X[2] >> X[3];
        for (int i = 1; i <= n; ++ i) {
            a[i] ^= X[i % 4];
        }

        i64 res = 0;
        for (int i = 1; i <= m; ++ i) {
            i64 x = query(c[i]);
            res ^= (i64(i) * x);
        }
        cout << res << '\n';

        for (int i = 1; i <= n; ++ i) {
            a[i] ^= X[i % 4];
        }
    }

    void Main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);

        cin >> n >> m;
        for (int i = 1; i <= n; ++ i) cin >> a[i];
        for (int i = 1; i <= m; ++ i) cin >> c[i];

        int k = 0;
        while ((1 << k) < n) k ++;
        for (int i = 1; i <= k; ++ i) {
            string s;
            cin >> s;
            for (int j = 0; j < (1 << (k - i)); ++ j) {
                D[i][j + 1] = s[j] - '0';
            }
        }

        int _;
        cin >> _;
        while (_ --) {
            solve();
        }
    }
}

int main() {
    PTqwq::Main();

    return 0;
}

为啥第三个点 wa 了/yiw

2024/11/1 19:14
加载中...