#include<cstdio>
#define MAXD 1000005
#define MOD 1000000007
int n;
int C[MAXD], D[MAXD];
int R[MAXD], T[MAXD], B[MAXD];
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&C[i],&D[i]);
R[n] = 0; T[n] = 1; B[n] = -1;
int bestT = -1;
for(int i=n-1;i>=0;i--){
int best = -1, bestV = 0;
int a = C[i], b = D[i];
int last = -1;
for(int j=0;i+j<n;j++){
a = max(a, C[i+j]);
b = min(b, D[i+j]);
if(b<j+1 || B[i+j]+1<best)break;
if(a <= j+1){
if(R[i+j+1]+1 > best){
best = R[i+j+1]+1;
bestV = T[i+j+1];
}else
if(R[i+j+1]+1 == best)
bestV = (bestV+T[i+j+1])%MOD;
}
}
if(best>0){
R[i] = best;
T[i] = bestV;
}else{
R[i] = -1;
T[i] = 0;
}
B[i] = max(R[i], B[i+1]);
//if((i&0xfff)==0)printf("%d\n",n-i);
}
if(R[0]==-1)
printf("NIE\n");
else{
printf("%d %d\n",R[0], T[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 | #include<cstdio> #define MAXD 1000005 #define MOD 1000000007 int n; int C[MAXD], D[MAXD]; int R[MAXD], T[MAXD], B[MAXD]; int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&C[i],&D[i]); R[n] = 0; T[n] = 1; B[n] = -1; int bestT = -1; for(int i=n-1;i>=0;i--){ int best = -1, bestV = 0; int a = C[i], b = D[i]; int last = -1; for(int j=0;i+j<n;j++){ a = max(a, C[i+j]); b = min(b, D[i+j]); if(b<j+1 || B[i+j]+1<best)break; if(a <= j+1){ if(R[i+j+1]+1 > best){ best = R[i+j+1]+1; bestV = T[i+j+1]; }else if(R[i+j+1]+1 == best) bestV = (bestV+T[i+j+1])%MOD; } } if(best>0){ R[i] = best; T[i] = bestV; }else{ R[i] = -1; T[i] = 0; } B[i] = max(R[i], B[i+1]); //if((i&0xfff)==0)printf("%d\n",n-i); } if(R[0]==-1) printf("NIE\n"); else{ printf("%d %d\n",R[0], T[0]); } } |
English