#include <iostream> #include <cstdio> #include <vector> using namespace std; #define DEBUG(x) int n; struct Prz{ int c,d; void zw(Prz p) { c=max(c,p.c); d=min(d,p.d); } }; struct Ucz{ Ucz():maks(0),podz(0){} unsigned int maks,podz; Prz p; void maksum(Ucz u) { if(maks > u.maks+1) return; if(maks == u.maks+1) { podz+= u.podz; podz %=1000000007; return; } maks=u.maks+1; podz = u.podz; } }; vector<Ucz> wej; void oblicz(Ucz &u) { Prz p=u.p; int ile = 0; int last = wej.size()-1; for(int i = last; i >= last - p.d && i>=0; i--) { DEBUG(printf("i; %d \n", i)); ile++; Ucz ui = wej[i]; if( p.c <= ile && ile<= p.d) { u.maksum(ui); } if(ile > p.d) break; p.zw(ui.p); ui.p=p; } } void print(Ucz &u) { printf("(%d, %d) %d %d\n", u.p.c,u.p.d, u.maks, u.podz); } int main() { scanf("%d",&n); Ucz u0; u0.podz=1; wej.push_back(u0); while(n--) { Ucz u; scanf("%d %d",&u.p.c,&u.p.d); oblicz(u); DEBUG(print(u)); wej.push_back(u); //cerr << "n: " << n << "\n"; } if(wej.back().maks == 0) printf("NIE\n"); else printf("%d %d\n", wej.back().maks, wej.back().podz); 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 68 69 70 71 | #include <iostream> #include <cstdio> #include <vector> using namespace std; #define DEBUG(x) int n; struct Prz{ int c,d; void zw(Prz p) { c=max(c,p.c); d=min(d,p.d); } }; struct Ucz{ Ucz():maks(0),podz(0){} unsigned int maks,podz; Prz p; void maksum(Ucz u) { if(maks > u.maks+1) return; if(maks == u.maks+1) { podz+= u.podz; podz %=1000000007; return; } maks=u.maks+1; podz = u.podz; } }; vector<Ucz> wej; void oblicz(Ucz &u) { Prz p=u.p; int ile = 0; int last = wej.size()-1; for(int i = last; i >= last - p.d && i>=0; i--) { DEBUG(printf("i; %d \n", i)); ile++; Ucz ui = wej[i]; if( p.c <= ile && ile<= p.d) { u.maksum(ui); } if(ile > p.d) break; p.zw(ui.p); ui.p=p; } } void print(Ucz &u) { printf("(%d, %d) %d %d\n", u.p.c,u.p.d, u.maks, u.podz); } int main() { scanf("%d",&n); Ucz u0; u0.podz=1; wej.push_back(u0); while(n--) { Ucz u; scanf("%d %d",&u.p.c,&u.p.d); oblicz(u); DEBUG(print(u)); wej.push_back(u); //cerr << "n: " << n << "\n"; } if(wej.back().maks == 0) printf("NIE\n"); else printf("%d %d\n", wej.back().maks, wej.back().podz); return 0; } |