제출 #1340839

#제출 시각아이디문제언어결과실행 시간메모리
1340839nguyenkhangninh99Misspelling (JOI22_misspelling)C++20
100 / 100
1516 ms220396 KiB

#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 5e5 + 5, mod = 1e9 + 7;
int pre[26][maxn], f[26][maxn]; 
int st[3][4 * maxn];


void update(int b, int id, int l, int r, int u, int v, int val){
    if(v < l || r < u) return;
    if(u <= l && r <= v) st[b][id] = max(st[b][id], val);
    else{
        int mid = (l + r) / 2;
        st[b][id * 2] = max(st[b][id * 2], st[b][id]);
        st[b][id * 2 + 1] = max(st[b][id * 2 + 1], st[b][id]);
        update(b, id * 2, l, mid, u, v, val);
        update(b, id * 2 + 1, mid + 1, r, u, v, val);
    }
}
int get(int b, int id, int l, int r, int p){
    if(l == r) return st[b][id];
    else{
        int mid = (l + r) / 2;
        st[b][id * 2] = max(st[b][id * 2], st[b][id]);
        st[b][id * 2 + 1] = max(st[b][id * 2 + 1], st[b][id]);
        if(p <= mid) return get(b, id * 2, l, mid, p);
        else return get(b, id * 2 + 1, mid + 1, r, p);
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m; cin >> n >> m;
    //điều kiện a, b 
    //với a < b thì i từ a đến b - 1 phải thỏa s[i] >= s[i + 1]
    //với a > b thì i từ b đến a - 1 phải thỏa s[i] <= s[i + 1]
    for(int i = 1; i <= m; i++){
        int a, b; cin >> a >> b;
        if(a < b) update(1, 1, 1, n, a, b - 1, a);
        else update(2, 1, 1, n, b, a - 1, b);
    }
    for(int c = 0; c < 26; c++) pre[c][1] = f[c][1] = 1; 

    for(int i = 2; i <= n; i++){
        int incr = get(1, 1, 1, n, i - 1), decr = get(2, 1, 1, n, i - 1);
        for(int c = 0; c < 26; c++){
            for(int d = 0; d < 26; d++){
               if(d == c) continue;

                int limit = (d < c) ? incr : decr;
                if(limit <= i - 1) (f[c][i] += pre[d][i - 1] - pre[d][limit] + mod) %= mod;
            }
            pre[c][i] = (pre[c][i - 1] + f[c][i]) % mod;
        }
    }

    int ans = 0;
    for(int k = 1; k <= n; k++){
        for(int c = 0; c < 26; c++) (ans += f[c][k]) %= mod;
    }
    cout << ans;
}
#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...