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