#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(); } |