제출 #1248199

#제출 시각아이디문제언어결과실행 시간메모리
1248199AvianshMisspelling (JOI22_misspelling)C++20
100 / 100
362 ms105584 KiB
#include <bits/stdc++.h>

using namespace std;

const int mod = 1e9+7;

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    int dp[n][26];
    vector<array<int,2>>constraints[n];
    for(int i = 0;i<m;i++){
        int a,b;
        cin >> a >> b;
        a--;b--;
        if(a==b)
            continue;
        if(a<b){
            constraints[a].push_back({b,1});
        }
        else{
            constraints[b].push_back({a,-1});
        }
    }
    for(int c = 0;c<26;c++){
        dp[n-1][c]=1;
    }
    set<int>pos1;
    set<int>pos2;
    pos1.insert(n-1);
    pos2.insert(n-1);
    int sum1[26];
    fill(sum1,sum1+26,1);
    int sum2[26];
    fill(sum2,sum2+26,1);
    //1 means 1, 2 means -1
    for(int i = n-2;i>=0;i--){
        for(array<int,2>cond : constraints[i]){
            if(cond[1]==1){
                while(pos1.size()&&*pos1.begin()<=cond[0]){
                    int a = *pos1.begin();
                    for(int j = 0;j<26;j++){
                        sum1[j]-=dp[a][j];
                        sum1[j]%=mod;
                    }
                    pos1.erase(pos1.begin());
                }
            }
            else{
                while(pos2.size()&&*pos2.begin()<=cond[0]){
                    int a = *pos2.begin();
                    for(int j = 0;j<26;j++){
                        sum2[j]-=dp[a][j];
                        sum2[j]%=mod;
                    }
                    pos2.erase(pos2.begin());
                }
            }
        }
        for(int j = 0;j<26;j++){
            dp[i][j]=1;
        }
        int pref = 0;
        for(int j = 0;j<25;j++){
            pref+=sum2[j];
            pref%=mod;
            dp[i][j+1]+=pref;
            dp[i][j+1]%=mod;
        }
        pref=0;
        for(int j = 25;j>0;j--){
            pref+=sum1[j];
            pref%=mod;
            dp[i][j-1]+=pref;
            dp[i][j-1]%=mod;
        }
        pos1.insert(i);
        pos2.insert(i);
        for(int j = 0;j<26;j++){
            sum1[j]+=dp[i][j];
            sum2[j]+=dp[i][j];
            sum1[j]%=mod;
            sum2[j]%=mod;
        }
    }
    int ans = 0;
    for(int i = 0;i<26;i++){
        ans+=dp[0][i];
        ans%=mod;
    }
    ans+=mod;
    ans%=mod;
    cout << ans << "\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...