Submission #937092

#TimeUsernameProblemLanguageResultExecution timeMemory
937092PanndaMisspelling (JOI22_misspelling)C++17
100 / 100
637 ms253012 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    static constexpr int P = 1e9 + 7;

    int n, m;
    cin >> n >> m;

    vector<int> enforce0(n, -1); // enforces s[i] >= s[i + 1]
    vector<int> enforce1(n, -1); // enforces s[i] <= s[i + 1]

    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        if (a < b) enforce0[a] = max(enforce0[a], b);
        else enforce1[b] = max(enforce1[b], a);
    }

    vector<int> all(n);
    iota(all.begin(), all.end(), 0);
    set<int> s0(all.begin(), all.end());
    set<int> s1(all.begin(), all.end());

    vector<vector<int>> dp(n, vector<int>(26, 0));
    vector<vector<int>> upper(n, vector<int>(26, 0));
    vector<vector<int>> lower(n, vector<int>(26, 0));
    dp[n - 1] = vector<int>(26, 1);
    int f = accumulate(dp[n - 1].begin(), dp[n - 1].end(), 0LL) % P;

    auto update = [&](int i) {
        for (int c = 24; c >= 0; c--) {
            upper[i][c] = (upper[i][c + 1] + dp[i][c + 1]) % P;
        }
        for (int c = 1; c < 26; c++) {
            lower[i][c] = (lower[i][c - 1] + dp[i][c - 1]) % P;
        }
    };
    update(n - 1);

    for (int i = n - 2; i >= 0; i--) {
        vector<int> adj0;
        vector<int> adj1;
        if (enforce0[i] != -1) {
            while (true) {
                auto it = s0.upper_bound(i);
                if (it == s0.end() || *it > enforce0[i]) break;
                adj0.push_back(*it);
                s0.erase(it);
            }
        }
        if (enforce1[i] != -1) {
            while (true) {
                auto it = s1.upper_bound(i);
                if (it == s1.end() || *it > enforce1[i]) break;
                adj1.push_back(*it);
                s1.erase(it);
            }
        }
        for (int c = 0; c < 26; c++) {
            dp[i][c] = (dp[i][c] + f) % P;
            for (int j : adj0) {
                dp[i][c] = (dp[i][c] - upper[j][c] + P) % P;
            }
            for (int j : adj1) {
                dp[i][c] = (dp[i][c] - lower[j][c] + P) % P;
            }
        }
        update(i);
        f = accumulate(dp[i].begin(), dp[i].end(), 0LL) % P;
    }

    cout << f << '\n';
}
#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...