#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;
struct BIT{
int n;
vector<ll> sm;
BIT(){}
BIT(int _n){
n = _n;
sm.resize(n);
}
void add(int in, ll x){
x%=md;
in++;
while(in <= n) sm[in-1]+=x, sm[in-1]%=md, in+=in&-in;
}
ll sum(int in){
in++;
ll s = 0;
while(in >= 1) s+=sm[in-1], s%=md, in-=in&-in;
return s;
}
ll sum(int l, int r){
return (sum(r)-(l == 0? 0:sum(l-1)))%md;
}
};
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<vector<ll>> DP1(n, vector<ll>(26, 0));
vector<vector<ll>> DP2(n, vector<ll>(26, 0));
dp[n-1] = vector<ll>(26, 1);
for(int i = 0; i < 26; i++) DP1[n-1][i] = 26-i, DP2[n-1][i] = i+1;
BIT high[26], low[26];
fill(high, high+26, BIT(n));
fill(low, low+26, BIT(n));
set<int> ss;
ss.insert(n-1);
set<int> s1, s2;
for(int i = n-2; i >= 0; i--){
for(int x: gr[i]){
auto it = ss.lower_bound(i);
while(it != ss.end() && *it <= x){
s1.insert(*it);
for(int j = 0; j < 26; j++) high[j].add(*it, DP1[*it][j]);
it = ss.erase(it);
}
it = s2.lower_bound(i);
while(it != s2.end() && *it <= x){
for(int j = 0; j < 26; j++) low[j].add(*it, -DP2[*it][j]);
it = s2.erase(it);
}
}
for(int x: lr[i]){
auto it = ss.lower_bound(i);
while(it != ss.end() && *it <= x){
s2.insert(*it);
for(int j = 0; j < 26; j++) low[j].add(*it, DP2[*it][j]);
it = ss.erase(it);
}
it = s1.lower_bound(i);
while(it != s1.end() && *it <= x){
for(int j = 0; j < 26; j++) high[j].add(*it, -DP1[*it][j]);
it = s1.erase(it);
}
}
int lm = -1;
if(!ss.empty()) lm = *ss.begin();
for(int j = 0; j < 26; j++){
if(j != 0) dp[i][j]+=low[j-1].sum(i, lm==-1?n-1:lm-1),dp[i][j]%=md;
if(j != 25) dp[i][j]+=high[j+1].sum(i, lm==-1?n-1:lm-1),dp[i][j]%=md;
if(lm == -1) dp[i][j]++, dp[i][j]%=md;
else dp[i][j]+=DP1[lm][0];
}
DP1[i] = dp[i];
DP2[i] = dp[i];
for(int j = 24; j >= 0; j--) DP1[i][j]+=DP1[i][j+1], DP1[i][j]%=md;
for(int j = 1; j < 26; j++) DP2[i][j]+=DP2[i][j-1], DP2[i][j]%=md;
ss.insert(i);
}
if(DP1[0][0] < 0) DP1[0][0]+=md;
cout << DP1[0][0] << "\n";
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
320 KB |
Output is correct |
9 |
Correct |
1 ms |
340 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
13 |
Correct |
1 ms |
212 KB |
Output is correct |
14 |
Correct |
1 ms |
308 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
320 KB |
Output is correct |
9 |
Correct |
1 ms |
340 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
13 |
Correct |
1 ms |
212 KB |
Output is correct |
14 |
Correct |
1 ms |
308 KB |
Output is correct |
15 |
Correct |
1 ms |
468 KB |
Output is correct |
16 |
Correct |
1 ms |
468 KB |
Output is correct |
17 |
Correct |
1 ms |
448 KB |
Output is correct |
18 |
Correct |
1 ms |
448 KB |
Output is correct |
19 |
Correct |
1 ms |
468 KB |
Output is correct |
20 |
Correct |
1 ms |
468 KB |
Output is correct |
21 |
Correct |
1 ms |
468 KB |
Output is correct |
22 |
Correct |
3 ms |
596 KB |
Output is correct |
23 |
Correct |
1 ms |
448 KB |
Output is correct |
24 |
Correct |
1 ms |
468 KB |
Output is correct |
25 |
Correct |
1 ms |
468 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
320 KB |
Output is correct |
5 |
Correct |
3341 ms |
611188 KB |
Output is correct |
6 |
Correct |
3344 ms |
611180 KB |
Output is correct |
7 |
Correct |
3221 ms |
611080 KB |
Output is correct |
8 |
Correct |
3168 ms |
611064 KB |
Output is correct |
9 |
Correct |
3401 ms |
610936 KB |
Output is correct |
10 |
Correct |
107 ms |
24848 KB |
Output is correct |
11 |
Correct |
1 ms |
468 KB |
Output is correct |
12 |
Correct |
0 ms |
212 KB |
Output is correct |
13 |
Correct |
3336 ms |
611044 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
320 KB |
Output is correct |
9 |
Correct |
1 ms |
340 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
13 |
Correct |
1 ms |
212 KB |
Output is correct |
14 |
Correct |
1 ms |
308 KB |
Output is correct |
15 |
Correct |
1 ms |
468 KB |
Output is correct |
16 |
Correct |
1 ms |
468 KB |
Output is correct |
17 |
Correct |
1 ms |
448 KB |
Output is correct |
18 |
Correct |
1 ms |
448 KB |
Output is correct |
19 |
Correct |
1 ms |
468 KB |
Output is correct |
20 |
Correct |
1 ms |
468 KB |
Output is correct |
21 |
Correct |
1 ms |
468 KB |
Output is correct |
22 |
Correct |
3 ms |
596 KB |
Output is correct |
23 |
Correct |
1 ms |
448 KB |
Output is correct |
24 |
Correct |
1 ms |
468 KB |
Output is correct |
25 |
Correct |
1 ms |
468 KB |
Output is correct |
26 |
Correct |
99 ms |
24756 KB |
Output is correct |
27 |
Correct |
90 ms |
25392 KB |
Output is correct |
28 |
Correct |
84 ms |
25224 KB |
Output is correct |
29 |
Correct |
118 ms |
24780 KB |
Output is correct |
30 |
Correct |
101 ms |
24776 KB |
Output is correct |
31 |
Correct |
186 ms |
27736 KB |
Output is correct |
32 |
Correct |
106 ms |
24884 KB |
Output is correct |
33 |
Correct |
101 ms |
24980 KB |
Output is correct |
34 |
Correct |
104 ms |
24684 KB |
Output is correct |
35 |
Correct |
198 ms |
28284 KB |
Output is correct |
36 |
Correct |
71 ms |
24888 KB |
Output is correct |
37 |
Correct |
100 ms |
24724 KB |
Output is correct |
38 |
Correct |
99 ms |
24592 KB |
Output is correct |
39 |
Correct |
98 ms |
24384 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
320 KB |
Output is correct |
9 |
Correct |
1 ms |
340 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
0 ms |
212 KB |
Output is correct |
12 |
Correct |
1 ms |
212 KB |
Output is correct |
13 |
Correct |
1 ms |
212 KB |
Output is correct |
14 |
Correct |
1 ms |
308 KB |
Output is correct |
15 |
Correct |
1 ms |
468 KB |
Output is correct |
16 |
Correct |
1 ms |
468 KB |
Output is correct |
17 |
Correct |
1 ms |
448 KB |
Output is correct |
18 |
Correct |
1 ms |
448 KB |
Output is correct |
19 |
Correct |
1 ms |
468 KB |
Output is correct |
20 |
Correct |
1 ms |
468 KB |
Output is correct |
21 |
Correct |
1 ms |
468 KB |
Output is correct |
22 |
Correct |
3 ms |
596 KB |
Output is correct |
23 |
Correct |
1 ms |
448 KB |
Output is correct |
24 |
Correct |
1 ms |
468 KB |
Output is correct |
25 |
Correct |
1 ms |
468 KB |
Output is correct |
26 |
Correct |
1 ms |
212 KB |
Output is correct |
27 |
Correct |
1 ms |
212 KB |
Output is correct |
28 |
Correct |
1 ms |
212 KB |
Output is correct |
29 |
Correct |
1 ms |
320 KB |
Output is correct |
30 |
Correct |
3341 ms |
611188 KB |
Output is correct |
31 |
Correct |
3344 ms |
611180 KB |
Output is correct |
32 |
Correct |
3221 ms |
611080 KB |
Output is correct |
33 |
Correct |
3168 ms |
611064 KB |
Output is correct |
34 |
Correct |
3401 ms |
610936 KB |
Output is correct |
35 |
Correct |
107 ms |
24848 KB |
Output is correct |
36 |
Correct |
1 ms |
468 KB |
Output is correct |
37 |
Correct |
0 ms |
212 KB |
Output is correct |
38 |
Correct |
3336 ms |
611044 KB |
Output is correct |
39 |
Correct |
99 ms |
24756 KB |
Output is correct |
40 |
Correct |
90 ms |
25392 KB |
Output is correct |
41 |
Correct |
84 ms |
25224 KB |
Output is correct |
42 |
Correct |
118 ms |
24780 KB |
Output is correct |
43 |
Correct |
101 ms |
24776 KB |
Output is correct |
44 |
Correct |
186 ms |
27736 KB |
Output is correct |
45 |
Correct |
106 ms |
24884 KB |
Output is correct |
46 |
Correct |
101 ms |
24980 KB |
Output is correct |
47 |
Correct |
104 ms |
24684 KB |
Output is correct |
48 |
Correct |
198 ms |
28284 KB |
Output is correct |
49 |
Correct |
71 ms |
24888 KB |
Output is correct |
50 |
Correct |
100 ms |
24724 KB |
Output is correct |
51 |
Correct |
99 ms |
24592 KB |
Output is correct |
52 |
Correct |
98 ms |
24384 KB |
Output is correct |
53 |
Correct |
3013 ms |
603300 KB |
Output is correct |
54 |
Correct |
2716 ms |
622572 KB |
Output is correct |
55 |
Correct |
3176 ms |
609224 KB |
Output is correct |
56 |
Correct |
3267 ms |
609216 KB |
Output is correct |
57 |
Correct |
3178 ms |
610932 KB |
Output is correct |
58 |
Correct |
3206 ms |
610940 KB |
Output is correct |
59 |
Correct |
3257 ms |
610936 KB |
Output is correct |
60 |
Correct |
3301 ms |
606864 KB |
Output is correct |
61 |
Correct |
2276 ms |
614772 KB |
Output is correct |
62 |
Correct |
3356 ms |
604576 KB |
Output is correct |
63 |
Correct |
3197 ms |
601952 KB |
Output is correct |
64 |
Correct |
3050 ms |
598888 KB |
Output is correct |