#include <iostream>
using namespace std;
struct Child{
int min;
int max;
};
struct Division{
int maxGroupsBefore;
int combinationsOfMaxGroups;
Division(){
this->maxGroupsBefore = 0;
this->combinationsOfMaxGroups = 0;
}
};
int main () {
int childrenAmount;
cin >> childrenAmount;
Child* children = new Child[childrenAmount];
Division* divisions = new Division[childrenAmount+1];
divisions[0].combinationsOfMaxGroups = 1;
const int mod = 1000000007;
for(int i=0; i<childrenAmount; i++){
cin >> children[i].min >> children[i].max;
}
for(int divisionId=0; divisionId<childrenAmount; divisionId++){
int newCombinations = divisions[divisionId].combinationsOfMaxGroups;
if(newCombinations + divisions[divisionId].maxGroupsBefore > 0){
int newMaxGroups = divisions[divisionId].maxGroupsBefore + 1;
int counter = 1;
int min = children[divisionId].min;
int max = children[divisionId].max;
bool noMoreGroups = false;
do{
if(counter >= min){ //max is checked later, for sure in first iteration max >= counter
Division* goalDivision = &divisions[divisionId+counter];
if(goalDivision->maxGroupsBefore < newMaxGroups){
goalDivision->maxGroupsBefore = newMaxGroups;
goalDivision->combinationsOfMaxGroups = newCombinations;
}
else if(goalDivision->maxGroupsBefore == newMaxGroups){
goalDivision->combinationsOfMaxGroups = (goalDivision->combinationsOfMaxGroups + newCombinations) % mod;
}
}
if(divisionId + counter < childrenAmount){
if(children[divisionId+counter].min > min) min = children[divisionId+counter].min;
if(children[divisionId+counter].max < max) max = children[divisionId+counter].max;
counter++;
if(counter > max) noMoreGroups = true;
}
else noMoreGroups = true;
}while(!noMoreGroups);
}
}
if(divisions[childrenAmount].maxGroupsBefore > 0){
cout << divisions[childrenAmount].maxGroupsBefore << " " << divisions[childrenAmount].combinationsOfMaxGroups;
}
else cout << "NIE\n";
delete [] children;
delete [] divisions;
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 | #include <iostream> using namespace std; struct Child{ int min; int max; }; struct Division{ int maxGroupsBefore; int combinationsOfMaxGroups; Division(){ this->maxGroupsBefore = 0; this->combinationsOfMaxGroups = 0; } }; int main () { int childrenAmount; cin >> childrenAmount; Child* children = new Child[childrenAmount]; Division* divisions = new Division[childrenAmount+1]; divisions[0].combinationsOfMaxGroups = 1; const int mod = 1000000007; for(int i=0; i<childrenAmount; i++){ cin >> children[i].min >> children[i].max; } for(int divisionId=0; divisionId<childrenAmount; divisionId++){ int newCombinations = divisions[divisionId].combinationsOfMaxGroups; if(newCombinations + divisions[divisionId].maxGroupsBefore > 0){ int newMaxGroups = divisions[divisionId].maxGroupsBefore + 1; int counter = 1; int min = children[divisionId].min; int max = children[divisionId].max; bool noMoreGroups = false; do{ if(counter >= min){ //max is checked later, for sure in first iteration max >= counter Division* goalDivision = &divisions[divisionId+counter]; if(goalDivision->maxGroupsBefore < newMaxGroups){ goalDivision->maxGroupsBefore = newMaxGroups; goalDivision->combinationsOfMaxGroups = newCombinations; } else if(goalDivision->maxGroupsBefore == newMaxGroups){ goalDivision->combinationsOfMaxGroups = (goalDivision->combinationsOfMaxGroups + newCombinations) % mod; } } if(divisionId + counter < childrenAmount){ if(children[divisionId+counter].min > min) min = children[divisionId+counter].min; if(children[divisionId+counter].max < max) max = children[divisionId+counter].max; counter++; if(counter > max) noMoreGroups = true; } else noMoreGroups = true; }while(!noMoreGroups); } } if(divisions[childrenAmount].maxGroupsBefore > 0){ cout << divisions[childrenAmount].maxGroupsBefore << " " << divisions[childrenAmount].combinationsOfMaxGroups; } else cout << "NIE\n"; delete [] children; delete [] divisions; return 0; }; |
English