Submission #1256579

#TimeUsernameProblemLanguageResultExecution timeMemory
1256579BahaminMisspelling (JOI22_misspelling)C++20
100 / 100
517 ms94348 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }

#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#define sui cout.tie(NULL); cin.tie(NULL); ios_base::sync_with_stdio(false)
const int MAX_N = 1e5 + 5;
const int MOD = 1e9 + 7;
const ll INF = 1e9;
const ld EPS = 1e-9;
const int LOG = 30;

inline int md(ll x) {x %= MOD; return x + (x < 0 ? MOD : 0);}
inline int ADD(ll a, ll b) {return md(a + b);}
inline int SUB(ll a, ll b) {return md(a - b);}
inline int MUL(ll a, ll b) {return md(1ll * a * b);}
inline int POW(ll a, ll b) {int res = 1; while (b){if (b & 1) res = MUL(res, a); a = MUL(a, a); b >>= 1;} return res;}
inline int DIV(ll a, ll b) {return MUL(a, POW(b, MOD - 2));}

void solve() {
    int n, m;
    cin >> n >> m;
    vector<pair<int, bool>> st[n];
    int dp[n][26];
    for (int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        a--; b--;
        bool ok = false;
        if (a > b) swap(a, b), ok = true;
        st[a].push_back(make_pair(b, ok));
    }
    int sum1[26];
    int sum2[26];
    int sum3[26];  
    fill(sum1, sum1 + 26, 0);
    fill(sum2, sum2 + 26, 0);
    fill(sum3, sum3 + 26, 0);
    set<int> s1;
    set<int> s2;
    set<int> s3;
    for (int i = n - 1; i >= 0; i--)
    {
        for (auto x : st[i]) 
        {
            if (x.second)
            {
                while (true)
                {
                    auto xx = s2.upper_bound(i);
                    if (xx != s2.end() && (*xx) <= x.first) 
                    {
                        int sum = 0;
                        for (int j = 0; j < 26; j++) sum2[j] = SUB(sum2[j], sum), sum = ADD(sum, dp[*xx][j]);
                        s2.erase(xx);
                    } else break;
                }
            } else 
            {
                while (true)
                {
                    auto xx = s3.upper_bound(i);
                    if (xx != s3.end() && (*xx) <= x.first) 
                    {
                        int sum = 0;
                        for (int j = 25; j >= 0; j--) sum3[j] = SUB(sum3[j], sum), sum = ADD(sum, dp[*xx][j]);
                        s3.erase(xx);
                    } else break;
                }
            }
            while (true)
            {
                auto xx = s1.upper_bound(i);
                if (xx != s1.end() && (*xx) <= x.first)
                {
                    if (!x.second)
                    {
                        int sum = 0;
                        for (int j = 0; j < 26; j++) sum2[j] = ADD(sum2[j], sum), sum = ADD(sum, dp[*xx][j]);
                        for (int j = 0; j < 26; j++) sum1[j] = SUB(sum1[j], SUB(sum, dp[*xx][j]));
                        s2.insert(*xx);
                        s1.erase(xx);
                    } else 
                    {
                        int sum = 0;
                        for (int j = 25; j >= 0; j--) sum3[j] = ADD(sum3[j], sum), sum = ADD(sum, dp[*xx][j]);
                        for (int j = 0; j < 26; j++) sum1[j] = SUB(sum1[j], SUB(sum, dp[*xx][j]));
                        s3.insert(*xx);
                        s1.erase(xx);
                    }
                } else break;
            }
        }   
        for (int j = 0; j < 26; j++) dp[i][j] = ADD(1, ADD(sum1[j], ADD(sum2[j], sum3[j])));
        s1.insert(i);
        int sum = 0;
        for (int j = 0; j < 26; j++) sum = ADD(sum, dp[i][j]);
        for (int j = 0; j < 26; j++) sum1[j] = ADD(sum1[j], SUB(sum, dp[i][j]));
    }
    int ans = 0;
    for (int i = 0; i < 26; i++) ans = ADD(ans, dp[0][i]);
    cout << ans << "\n";
}

int main() {
    sui;
    int tc = 1;
    //cin >> tc;
    for (int t = 1; t <= tc; t++) {
        solve();
    }
}
#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...