답안 #564521

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
564521 2022-05-19T10:23:25 Z Stickfish Intergalactic ship (IZhO19_xorsum) C++17
92 / 100
2000 ms 2688 KB
#include <iostream>
#include <vector>
#include <map>
#include <bitset>
using namespace std;
using ll = long long;
using ull = unsigned long long;

const int MAXN = 1008;
const ll MOD = 1000000007;
const int MAXVAL = 128;
const int HEY = MAXVAL * 3;
int a[MAXN];

void updt(bitset<MAXVAL>& bs, int t) {
    if (bs[bs._Find_first() ^ t])
        return;
    vector<int> it;
    for (int i = bs._Find_first(); i < MAXVAL; i = bs._Find_next(i)) {
        it.push_back(i ^ t);
    }
    for (auto i : it)
        bs[i] = 1;
}

ll pw(ll a, ll m) {
    if (!m)
        return 1;
    a %= MOD;
    if (m % 2)
        return a * pw(a, m - 1) % MOD;
    return pw(a * a, m / 2);
}

bool in(pair<int, int> sg, int i) {
    return sg.first <= i && i < sg.second;
}

vector<pair<int, int>> events[MAXN];

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    int q;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        int l, r, x;
        cin >> l >> r >> x;
        --l;
        events[l].push_back({r, x});
        events[r].push_back({l, x});
    }
    ll ans = 0;
    vector<int> genij0(MAXVAL, 0);
    bitset<MAXVAL> genbsij0;
    for (int i = 0; i < n; ++i) {
        for (auto [e, x] : events[i]) {
            if (e < i)
                genbsij0[x] = --genij0[x];
            else
                genbsij0[x] = ++genij0[x];
        }
        vector<int> geni(MAXVAL);
        bitset<MAXVAL> genbsi;
        vector<int> genj(MAXVAL);
        bitset<MAXVAL> genbsj;
        vector<int> genij = genij0;
        bitset<MAXVAL> genbsij = genbsij0;

        for (int j = i; j < n; ++j) {
            if (j > i) {
                for (auto [e, x] : events[j]) {
                    if (e <= i) {
                        genbsij[x] = --genij[x];
                        genbsi[x] = ++geni[x];
                    } else if (e < j) {
                        genbsj[x] = --genj[x];
                    } else {
                        genbsj[x] = ++genj[x];
                    }
                }
            }
            bitset<MAXVAL> bsi;
            bitset<MAXVAL> bsj;
            bitset<MAXVAL> bsij;
            bsi[a[i]] = bsj[a[j]] = bsij[0] = 1;
            //cout << "---" << i << ' ' << j << "---\n";
            for (int xi = genbsi._Find_first(); xi < MAXVAL; xi = genbsi._Find_next(xi)) {
                //cout << xi << ' ';
                updt(bsi, xi);
            }
            //cout << endl;
            for (int xj = genbsj._Find_first(); xj < MAXVAL; xj = genbsj._Find_next(xj)) {
                //cout << xj << ' ';
                updt(bsj, xj);
            }
            //cout << endl;
            for (int xij = genbsij._Find_first(); xij < MAXVAL; xij = genbsij._Find_next(xij)) {
                //cout << xij << ' ';
                updt(bsij, xij);
            }
            //cout << endl;
            ll addans = 0;
            if (bsij.count() == 128 && (bsi.count() == 128 || bsj.count() == 128)) {
                if (bsi.count() == 128) {
                    addans += 64ll * 127 * 64 * 127 * bsj.count();
                } else if (bsj.count() == 128) {
                    addans += 64ll * 127 * 64 * 127 * bsi.count();
                } else {
                    vector<int> xj_xi(MAXVAL);
                    for (int xi = bsi._Find_first(); xi < MAXVAL; xi = bsi._Find_next(xi)) {
                        for (int xj = bsj._Find_first(); xj < MAXVAL; xj = bsj._Find_next(xj)) {
                            ++xj_xi[xj ^ xi];
                        }
                    }
                }
            } else {
                vector<int> xj_from_xij(MAXVAL);
                for (int xij = bsij._Find_first(); xij < MAXVAL; xij = bsij._Find_next(xij)) {
                    if (bsj.count() == 128) {
                        xj_from_xij[xij] = 64 * 127;
                    } else {
                        for (int xj = bsj._Find_first(); xj < MAXVAL; xj = bsj._Find_next(xj)) {
                            xj_from_xij[xij] += xj ^ xij;
                        }
                    }
                }
                for (int xij = bsij._Find_first(); xij < MAXVAL; xij = bsij._Find_next(xij)) {
                    if (bsi.count() == 128) {
                        addans += xj_from_xij[xij] * 64 * 127;
                    } else {
                        for (int xi = bsi._Find_first(); xi < MAXVAL; xi = bsi._Find_next(xi)) {
                            addans += xj_from_xij[xij] * (xi ^ xij);
                        }
                    }
                    addans %= MOD;
                }
            }
            if (i != j) {
                addans *= 2;
            }
            addans *= (i + 1) * (n - j);
            addans %= MOD;
            addans *= pw(2, q);
            addans %= MOD;
            //cout << bsi.count() << ' ' << bsj.count() << ' ' << bsij.count() << endl;
            addans *= pw(bsi.count() * bsj.count() * bsij.count(), MOD - 2);
            ans += addans;
            ans %= MOD;
            //cout << i << ' ' << j << ": " << ans - ans0 << endl;
        }
    }
    cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 2 ms 340 KB Output is correct
8 Correct 3 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 96 ms 2416 KB Output is correct
2 Correct 20 ms 596 KB Output is correct
3 Correct 8 ms 368 KB Output is correct
4 Correct 3 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 239 ms 344 KB Output is correct
2 Correct 218 ms 340 KB Output is correct
3 Correct 195 ms 340 KB Output is correct
4 Correct 210 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 9 ms 468 KB Output is correct
5 Correct 9 ms 468 KB Output is correct
6 Correct 8 ms 520 KB Output is correct
7 Correct 8 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 2 ms 340 KB Output is correct
8 Correct 3 ms 340 KB Output is correct
9 Correct 2 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 35 ms 340 KB Output is correct
13 Correct 35 ms 340 KB Output is correct
14 Correct 17 ms 340 KB Output is correct
15 Correct 58 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 2 ms 340 KB Output is correct
8 Correct 3 ms 340 KB Output is correct
9 Correct 2 ms 340 KB Output is correct
10 Correct 2 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 9 ms 468 KB Output is correct
13 Correct 9 ms 468 KB Output is correct
14 Correct 8 ms 520 KB Output is correct
15 Correct 8 ms 468 KB Output is correct
16 Correct 35 ms 340 KB Output is correct
17 Correct 35 ms 340 KB Output is correct
18 Correct 17 ms 340 KB Output is correct
19 Correct 58 ms 348 KB Output is correct
20 Correct 1437 ms 2600 KB Output is correct
21 Correct 914 ms 2476 KB Output is correct
22 Correct 1106 ms 2688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 5 ms 340 KB Output is correct
7 Correct 2 ms 340 KB Output is correct
8 Correct 3 ms 340 KB Output is correct
9 Correct 96 ms 2416 KB Output is correct
10 Correct 20 ms 596 KB Output is correct
11 Correct 8 ms 368 KB Output is correct
12 Correct 3 ms 340 KB Output is correct
13 Correct 239 ms 344 KB Output is correct
14 Correct 218 ms 340 KB Output is correct
15 Correct 195 ms 340 KB Output is correct
16 Correct 210 ms 340 KB Output is correct
17 Correct 2 ms 340 KB Output is correct
18 Correct 2 ms 340 KB Output is correct
19 Correct 1 ms 340 KB Output is correct
20 Correct 9 ms 468 KB Output is correct
21 Correct 9 ms 468 KB Output is correct
22 Correct 8 ms 520 KB Output is correct
23 Correct 8 ms 468 KB Output is correct
24 Correct 35 ms 340 KB Output is correct
25 Correct 35 ms 340 KB Output is correct
26 Correct 17 ms 340 KB Output is correct
27 Correct 58 ms 348 KB Output is correct
28 Correct 1437 ms 2600 KB Output is correct
29 Correct 914 ms 2476 KB Output is correct
30 Correct 1106 ms 2688 KB Output is correct
31 Execution timed out 2079 ms 2516 KB Time limit exceeded
32 Halted 0 ms 0 KB -