#include <cstdio>
#include <algorithm>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <string>
#include <set>
#include <cstring>
#include <iostream>
#include <sstream>
#include <cassert>
using namespace std;
#define PB push_back
#define FORE(i,t) for(typeof(t.begin())i=t.begin();i!=t.end();++i)
#define SZ(x) int((x).size())
#define REP(i,n) for(int i=0,_=(n);i<_;++i)
#define FOR(i,a,b) for(int i=(a),_=(b);i<=_;++i)
#define FORD(i,a,b) for(int i=(a),_=(b);i>=_;--i)
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int MOD = 1e9 + 7;
const int MAX_N = 1e6 + 2;
int a[MAX_N], b[MAX_N], result[MAX_N], possible[MAX_N];
void inline jeden() {
int n;
scanf("%d", &n);
a[0] = b[0] = 0;
FOR(i, 1, n) {
scanf("%d%d", a + i, b + i);
}
result[0] = 0;
possible[0] = 1;
FOR(i, 1, n) {
result[i] = 0;
possible[i] = 0;
int max_a = a[i]; //get_max_a(j, i);
int min_b = b[i]; //get_min_b(j, i);
FOR(d, 1, b[i]) {
int j = i - (d - 1);
if (j < 1) {
break;
}
max_a = max(max_a, a[j]);
min_b = min(min_b, b[j]);
if (d < a[i]) {
continue;
}
if (d >= max_a && d <= min_b) {
if (result[j - 1] + 1 > result[i]) {
result[i] = result[j - 1] + 1;
possible[i] = 0;
}
if (result[j - 1] + 1 == result[i]) {
possible[i] = (possible[i] + possible[j - 1]) % MOD;
}
}
}
}
if (result[n] > 0) {
printf("%d %d\n", result[n], possible[n]);
} else {
puts("NIE");
}
}
int main() {
//int z; scanf("%d", &z); while(z--)
jeden();
}
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <cstdio> #include <algorithm> #include <vector> #include <list> #include <stack> #include <queue> #include <cmath> #include <map> #include <string> #include <set> #include <cstring> #include <iostream> #include <sstream> #include <cassert> using namespace std; #define PB push_back #define FORE(i,t) for(typeof(t.begin())i=t.begin();i!=t.end();++i) #define SZ(x) int((x).size()) #define REP(i,n) for(int i=0,_=(n);i<_;++i) #define FOR(i,a,b) for(int i=(a),_=(b);i<=_;++i) #define FORD(i,a,b) for(int i=(a),_=(b);i>=_;--i) typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; const int MOD = 1e9 + 7; const int MAX_N = 1e6 + 2; int a[MAX_N], b[MAX_N], result[MAX_N], possible[MAX_N]; void inline jeden() { int n; scanf("%d", &n); a[0] = b[0] = 0; FOR(i, 1, n) { scanf("%d%d", a + i, b + i); } result[0] = 0; possible[0] = 1; FOR(i, 1, n) { result[i] = 0; possible[i] = 0; int max_a = a[i]; //get_max_a(j, i); int min_b = b[i]; //get_min_b(j, i); FOR(d, 1, b[i]) { int j = i - (d - 1); if (j < 1) { break; } max_a = max(max_a, a[j]); min_b = min(min_b, b[j]); if (d < a[i]) { continue; } if (d >= max_a && d <= min_b) { if (result[j - 1] + 1 > result[i]) { result[i] = result[j - 1] + 1; possible[i] = 0; } if (result[j - 1] + 1 == result[i]) { possible[i] = (possible[i] + possible[j - 1]) % MOD; } } } } if (result[n] > 0) { printf("%d %d\n", result[n], possible[n]); } else { puts("NIE"); } } int main() { //int z; scanf("%d", &z); while(z--) jeden(); } |
English