#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |