#include <iostream>
#include <cassert>
using namespace std;
typedef long long LL;
const int MAXN = (1<<20)+1;
const int P = 1000000007;
const int OO = (1<<30)-1;
int low[MAXN];
int high[MAXN];
int last[MAXN];
LL ways[MAXN];
int teams[MAXN];
int n;
int main() {
assert(1 == scanf("%d", &n));
for (int i = 0; i < n; ++i) {
assert(2 == scanf("%d%d", &low[i], &high[i]));
}
ways[n] = 1;
teams[n] = 0;
int best = 0;
for (int i = 0; i < n; ++i) {
last[i] = -1;
}
for (int i = n-1; i >= 0; --i) {
teams[i] = -OO;
ways[i] = 0;
int clow = low[i];
int chigh = high[i];
for (int j = i + 1; j <= n; ++j) {
if (j - i > chigh) {
break;
}
if (clow <= j - i and j - i <= chigh) {
if (ways[j] > 0) {
if (teams[j] + 1 > teams[i]) {
teams[i] = teams[j] + 1;
ways[i] = ways[j];
} else if (teams[j] + 1 == teams[i]) {
ways[i] += ways[j];
}
if (teams[j] + 1 == teams[i] and teams[j] == best and j == last[best]) {
break;
}
}
}
clow = max(clow, low[j]);
chigh = min(chigh, high[j]);
}
ways[i] %= P;
if (teams[i] > 0 and last[teams[i]] == -1) {
last[teams[i]] = i;
}
best = max(best, teams[i]);
}
if (teams[0] < 0) {
printf("NIE\n");
} else {
printf("%d %lld\n", teams[0], ways[0]);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <iostream> #include <cassert> using namespace std; typedef long long LL; const int MAXN = (1<<20)+1; const int P = 1000000007; const int OO = (1<<30)-1; int low[MAXN]; int high[MAXN]; int last[MAXN]; LL ways[MAXN]; int teams[MAXN]; int n; int main() { assert(1 == scanf("%d", &n)); for (int i = 0; i < n; ++i) { assert(2 == scanf("%d%d", &low[i], &high[i])); } ways[n] = 1; teams[n] = 0; int best = 0; for (int i = 0; i < n; ++i) { last[i] = -1; } for (int i = n-1; i >= 0; --i) { teams[i] = -OO; ways[i] = 0; int clow = low[i]; int chigh = high[i]; for (int j = i + 1; j <= n; ++j) { if (j - i > chigh) { break; } if (clow <= j - i and j - i <= chigh) { if (ways[j] > 0) { if (teams[j] + 1 > teams[i]) { teams[i] = teams[j] + 1; ways[i] = ways[j]; } else if (teams[j] + 1 == teams[i]) { ways[i] += ways[j]; } if (teams[j] + 1 == teams[i] and teams[j] == best and j == last[best]) { break; } } } clow = max(clow, low[j]); chigh = min(chigh, high[j]); } ways[i] %= P; if (teams[i] > 0 and last[teams[i]] == -1) { last[teams[i]] = i; } best = max(best, teams[i]); } if (teams[0] < 0) { printf("NIE\n"); } else { printf("%d %lld\n", teams[0], ways[0]); } return 0; } |
English