이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;
const ll md = 1000000007;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m; cin >> n >> m;
vector<vector<int>> gr(n), lr(n);
for(int i = 0; i < m; i++){
int a, b; cin >> a >> b; a--, b--;
if(a < b) lr[a].pb(b);
else gr[b].pb(a);
}
vector<vector<ll>> dp(n, vector<ll>(26, 0));
vector<ll> DP(n, 0);
dp[n-1] = vector<ll>(26, 1);
DP[n-1] = 26;
set<int> ss;
ss.insert(n-1);
set<int> s1, s2;
ll A[26], B[26];
for(int i = n-2; i >= 0; i--){
fill(A, A+26, 0);
fill(B, B+26, 0);
for(int x: gr[i]){
auto it = ss.lower_bound(i);
int a = -1;
if(it != ss.end()) a = *it;
while(it != ss.end() && *it <= x){
s1.insert(*it);
it = ss.erase(it);
}
it = s2.lower_bound(i);
while(it != s2.end() && *it <= x){
if(*it < (a==-1?n:a))
for(int j = 0; j < 26; j++) B[j]-=dp[*it][j], B[j]%=md;
it = s2.erase(it);
}
if(a != -1){
int b = n;
if(!ss.empty()) b = *ss.begin();
auto it = s1.lower_bound(a);
while(it != s1.end() && *it < b){
for(int j = 0; j < 26; j++) A[j]+=dp[*it][j], A[j]%=md;
it++;
}
it = s2.lower_bound(a);
while(it != s2.end() && *it < b){
for(int j = 0; j < 26; j++) B[j]+=dp[*it][j], B[j]%=md;
it++;
}
}
}
for(int x: lr[i]){
auto it = ss.lower_bound(i);
int a = -1;
if(it != ss.end()) a = *it;
while(it != ss.end() && *it <= x){
s2.insert(*it);
it = ss.erase(it);
}
it = s1.lower_bound(i);
while(it != s1.end() && *it <= x){
if(*it < (a==-1?n:a))
for(int j = 0; j < 26; j++) A[j]-=dp[*it][j], A[j]%=md;
it = s1.erase(it);
}
if(a != -1){
int b = n;
if(!ss.empty()) b = *ss.begin();
auto it = s1.lower_bound(a);
while(it != s1.end() && *it < b){
for(int j = 0; j < 26; j++) A[j]+=dp[*it][j], A[j]%=md;
it++;
}
it = s2.lower_bound(a);
while(it != s2.end() && *it < b){
for(int j = 0; j < 26; j++) B[j]+=dp[*it][j], B[j]%=md;
it++;
}
}
}
for(int j = 24; j >= 0; j--) A[j]+=A[j+1], A[j]%=md;
for(int j = 1; j < 26; j++) B[j]+=B[j-1], B[j]%=md;
for(int j = 0; j < 26; j++){
if(j != 0) dp[i][j]+=B[j-1], dp[i][j]%=md;
if(j != 25) dp[i][j]+=A[j+1], dp[i][j]%=md;
if(ss.empty()) dp[i][j]++, dp[i][j]%=md;
else dp[i][j]+=DP[*ss.begin()];
}
ss.insert(i);
for(int j = 0; j < 26; j++) DP[i]+=dp[i][j], DP[i]%=md;
if(DP[0] < 0) DP[0]+=md;
}
cout << DP[0] << "\n";
}
# | 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... |