Submission #681594

#TimeUsernameProblemLanguageResultExecution timeMemory
681594grandmast3rIntergalactic ship (IZhO19_xorsum)C++17
36 / 100
2084 ms6608 KiB
#include <bits/stdc++.h>
 
#define ll long long
#define ld long double
#define vi vector<int>
#define pii pair<int, int>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define int long long
 
using namespace std;
 
const int MOD = 1e9 + 7;
 
int add(int a, int b){
    a += b;
    if (a >= MOD){
        a -= MOD;
    }
    return a;
}
 
int sub(int a, int b){
    a -= b;
    if (a < 0){
        a += MOD;
    }
    return a;
}
 
int mul(int a, int b){
    return (a * 1ll * b) % MOD;
}
 
int naive(vector<int> a, vector<vector<int>> req){
    int n = a.size() - 1;
    int q = req.size();
    int res = 0;
    for (int i = 1; i <= n; i++){
        for (int j = i; j <= n; j++){
            vector<vector<vector<int>>> dp0((1 << 7), vector<vector<int>>(7, vector<int>(2)));
            vector<vector<vector<int>>> dp1((1 << 7), vector<vector<int>>(7, vector<int>(2)));
            for (int k = 0; k < 7; k++){
                dp0[a[i]][k][bool(a[j] & (1 << k))]++;
            }
            for (int w = 0; w < q; w++){
                dp1 = dp0;
                int x = 0;
                int y = 0;
                if (req[w][0] <= i && i <= req[w][1]){
                    x = req[w][2];
                }
                if (req[w][0] <= j && j <= req[w][1]){
                    y = req[w][2];
                }
                for (int s = 0; s < (1 << 7); s++){
                    for (int k = 0; k < 7; k++){
                        if (y & (1 << k)){
                            swap(dp0[s][k][0], dp0[s][k][1]);
                        }
                        dp1[s ^ x][k][0] = add(dp1[s ^ x][k][0], dp0[s][k][0]);
                        dp1[s ^ x][k][1] = add(dp1[s ^ x][k][1], dp0[s][k][1]);
                    }
                }
                dp1.swap(dp0);
            }
            int segcnt = mul(i, n - j + 1);
            int t = mul(segcnt, 1 + (i != j));
            for (int s = 0; s < (1 << 7); s++){
                for (int k = 0; k < 7; k++){
                    res = add(res, mul(mul(s, mul(dp0[s][k][1], (1 << k))), t));
                }
            }
        }
    }
    return res;
}

vector<vector<vector<int>>> pref;

int count(int x, int i1, int j1, int i2, int j2){
    if (i1 > i2 || j1 > j2){
        return 0;
    }
    return pref[x][i2][j2] - pref[x][i1 - 1][j2] - pref[x][i2][j1 - 1] + pref[x][i1 - 1][j1 - 1];
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifdef ON_PC
        freopen("input.txt", "r", stdin);
    #endif
    // freopen("output.txt", "w", stdout);
    vector<int> pw2(1e3 + 10);
    pw2[0] = 1;
    for (int i = 1; i < 1e3 + 10; i++){
        pw2[i] = mul(pw2[i - 1], 2);
    }
    int T = 1;
    // cin >> T;
    while (T--){
        int n;
        cin >> n;
        vector<int> a(n + 1);
        for (int i = 1; i <= n; i++){
            cin >> a[i];
        }
        int q;
        cin >> q;
        vector<vector<int>> req(q);
        for (int id = 0; id < q; id++){
            req[id].resize(3);
            for (int i = 0; i < 3; i++){
                cin >> req[id][i];
            }
        }
        #ifdef ON_PC
            cout << naive(a, req) << "\n";
        #endif
        int res = 0;
        for (int i = 1; i <= n; i++){
            for (int j = i; j <= n; j++){
                int segcnt = mul(i, n - j + 1);
                int t = mul(segcnt, 1 + (i != j));
                int sum = 0;
                for (int x = 0; x < 7; x++){
                    for (int y = 0; y < 7; y++){
                        vector<int> dp0(4);
                        vector<int> dp1(4);
                        dp0[(bool(a[i] & (1 << x)) << 1) | (bool(a[j] & (1 << y)))] = 1;
                        for (int k = 0; k < q; k++){
                            dp1 = dp0;
                            int i1 = 0;
                            if (req[k][0] <= i && i <= req[k][1]){
                                i1 = bool(req[k][2] & (1 << x));
                            }
                            int i2 = 0;
                            if (req[k][0] <= j && j <= req[k][1]){
                                i2 = bool(req[k][2] & (1 << y));
                            }
                            int s = (i1 << 1) | i2;
                            for (int w = 0; w < 4; w++){
                                dp1[w ^ s] = add(dp1[w ^ s], dp0[w]);
                            }
                            dp1.swap(dp0);
                        }
                        sum = add(sum, mul(pw2[x + y], dp0[3]));
                    }
                }
                sum = mul(sum, t);
                res = add(res, sum);
            }
        }
        cout << res << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...