#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
int n;
#define MOD 1000000007
/** Opis gracza i jednocześnie miejsca w którym jest */
struct Info {
// dane wejściowe
int min; // minmalna drużyna w jakiej chce grać
int max; // maksymalna drużyna w jakiej chce grać
// pola wyliczone porzez algorytm
int maxTeams; // maksymalna ilość drużyn dla tego miejsca
uint32_t vers; // ilość wersji modulo MOD
};
Info* data;
void processFor(int pl) {
// z danego miejsca sprawdzam wszystkie możliwe rozmiary drużyny dla danego gracza
Info* v=&data[pl];
#ifdef DEBUG
fprintf(stderr,"[%d] Processing <%d, %d>\n",pl,v->min,v->max);
#endif
int maxTeams=0;
uint32_t maxVers=0;
// minium od którego jest sprawdzanie
int min=1;
// maksimum do którego jest sprawdzane
int max=n+1;
#ifdef DEBUG
int it=0;
#endif
for(int ts=1;ts<=max;++ts) {
#ifdef DEBUG
++it;
#endif
if(ts+pl>n) break; // poza obszarem
Info* t=&data[pl+ts-1];
// aktualizujemy min i maxy o następną osobę
if(t->min>min) min=t->min;
if(t->max<max) max=t->max;
if(min>max) { // nie ma drużyny spełniającej taki warunek
break;
}
if(ts<min) continue; // min nie został osiągnięty jeszcze
// jeżeli każdy z graczy może grać, to bierzemy resztę opcji z pozycji pl+ts+1;
int teams;
uint32_t vers;
//fprintf(stderr,"PL=%d, TS=%d, N=%d, %d<%d\n",pl,ts,n,ts+pl);
if(ts+pl<n) { // jeżeli coś jest jeszcze, a nie koniec
Info* nt=&data[ts+pl];
if(nt->maxTeams==0) continue; // nie można dalej utworzyć drużyn, więc złe
teams=nt->maxTeams+1;
vers=nt->vers;
} else { // koniec, więc to tylko ta drużyna
teams=1;
vers=1;
}
if(teams>maxTeams) {
maxTeams=teams;
maxVers=vers;
} else if(teams==maxTeams) {
maxVers=(maxVers+vers)%MOD;
}
}
v->maxTeams=maxTeams;
v->vers=maxVers;
#ifdef DEBUG
fprintf(stderr,"[%d] Results: MT=%d MV=%d Power=%d\n",pl,maxTeams,maxVers,it);
#endif
}
int main() {
scanf("%d",&n);
data=(Info*)malloc(sizeof(Info)*n);
for(int i=0;i<n;++i) {
Info *v=&data[i];
scanf("%d %d",&v->min,&v->max);
}
for(int i=n-1;i>=0;--i) {
processFor(i);
}
if(data[0].maxTeams==0) {
printf("NIE\n");
} else {
printf("%d %d\n",data[0].maxTeams, data[0].vers);
}
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include<stdio.h> #include<stdlib.h> #include<stdint.h> int n; #define MOD 1000000007 /** Opis gracza i jednocześnie miejsca w którym jest */ struct Info { // dane wejściowe int min; // minmalna drużyna w jakiej chce grać int max; // maksymalna drużyna w jakiej chce grać // pola wyliczone porzez algorytm int maxTeams; // maksymalna ilość drużyn dla tego miejsca uint32_t vers; // ilość wersji modulo MOD }; Info* data; void processFor(int pl) { // z danego miejsca sprawdzam wszystkie możliwe rozmiary drużyny dla danego gracza Info* v=&data[pl]; #ifdef DEBUG fprintf(stderr,"[%d] Processing <%d, %d>\n",pl,v->min,v->max); #endif int maxTeams=0; uint32_t maxVers=0; // minium od którego jest sprawdzanie int min=1; // maksimum do którego jest sprawdzane int max=n+1; #ifdef DEBUG int it=0; #endif for(int ts=1;ts<=max;++ts) { #ifdef DEBUG ++it; #endif if(ts+pl>n) break; // poza obszarem Info* t=&data[pl+ts-1]; // aktualizujemy min i maxy o następną osobę if(t->min>min) min=t->min; if(t->max<max) max=t->max; if(min>max) { // nie ma drużyny spełniającej taki warunek break; } if(ts<min) continue; // min nie został osiągnięty jeszcze // jeżeli każdy z graczy może grać, to bierzemy resztę opcji z pozycji pl+ts+1; int teams; uint32_t vers; //fprintf(stderr,"PL=%d, TS=%d, N=%d, %d<%d\n",pl,ts,n,ts+pl); if(ts+pl<n) { // jeżeli coś jest jeszcze, a nie koniec Info* nt=&data[ts+pl]; if(nt->maxTeams==0) continue; // nie można dalej utworzyć drużyn, więc złe teams=nt->maxTeams+1; vers=nt->vers; } else { // koniec, więc to tylko ta drużyna teams=1; vers=1; } if(teams>maxTeams) { maxTeams=teams; maxVers=vers; } else if(teams==maxTeams) { maxVers=(maxVers+vers)%MOD; } } v->maxTeams=maxTeams; v->vers=maxVers; #ifdef DEBUG fprintf(stderr,"[%d] Results: MT=%d MV=%d Power=%d\n",pl,maxTeams,maxVers,it); #endif } int main() { scanf("%d",&n); data=(Info*)malloc(sizeof(Info)*n); for(int i=0;i<n;++i) { Info *v=&data[i]; scanf("%d %d",&v->min,&v->max); } for(int i=n-1;i>=0;--i) { processFor(i); } if(data[0].maxTeams==0) { printf("NIE\n"); } else { printf("%d %d\n",data[0].maxTeams, data[0].vers); } return 0; } |
English