#include<bits/stdc++.h>
using namespace std;
const int N=1e6+50;
pair<int, int> Wczytaj[N];
int Ile[N];
vector< pair<int, int> > JakieDochodza[N];
priority_queue< pair<int, int> >Najlepsze;
vector< pair<int, int> >Dodaj;
void WczytajDane(int &n, int &m, int &maxi){
int i, a, b, c;
scanf("%d%d", &n, &m);
maxi=0;
for(i=1; i<=n; i++){
scanf("%d%d%d", &a, &Wczytaj[i].first, &Wczytaj[i].second);
maxi=max(Wczytaj[i].first, maxi);
JakieDochodza[a].push_back( make_pair( -( Wczytaj[i].first-a-Wczytaj[i].second), i) );
}
}
void SprawdzWynik(int n, int m, int dokad){
int i, j, a, b, wiel;
pair<int, int> aktu;
i=0;
while(i<=dokad){
for(j=0; j<JakieDochodza[i].size(); j++){
Najlepsze.push( JakieDochodza[i][j] );
}
wiel=Najlepsze.size();
for(j=0; j<min(wiel, m); j++){
aktu=Najlepsze.top();
a=-( aktu.first );
b=aktu.second;
Ile[b]++;
Najlepsze.pop();
if(i>=Wczytaj[b].first){
printf("NIE\n");
return;
}
if(Ile[b]<Wczytaj[b].second){
Dodaj.push_back( make_pair( -a, b) );
}
}
for(j=m; j<wiel; j++){
aktu=Najlepsze.top();
Najlepsze.pop();
Dodaj.push_back( make_pair( aktu.first-1, aktu.second ) );
}
for(j=0; j<Dodaj.size(); j++){
Najlepsze.push( Dodaj[j] );
}
while(!Dodaj.empty()){
Dodaj.pop_back();
}
i++;
}
if(!Najlepsze.empty()){
printf("NIE\n");
return;
}
printf("TAK\n");
return;
}
int main (){
int n, m, ile;
WczytajDane(n, m, ile);
SprawdzWynik(n, m, ile);
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 | #include<bits/stdc++.h> using namespace std; const int N=1e6+50; pair<int, int> Wczytaj[N]; int Ile[N]; vector< pair<int, int> > JakieDochodza[N]; priority_queue< pair<int, int> >Najlepsze; vector< pair<int, int> >Dodaj; void WczytajDane(int &n, int &m, int &maxi){ int i, a, b, c; scanf("%d%d", &n, &m); maxi=0; for(i=1; i<=n; i++){ scanf("%d%d%d", &a, &Wczytaj[i].first, &Wczytaj[i].second); maxi=max(Wczytaj[i].first, maxi); JakieDochodza[a].push_back( make_pair( -( Wczytaj[i].first-a-Wczytaj[i].second), i) ); } } void SprawdzWynik(int n, int m, int dokad){ int i, j, a, b, wiel; pair<int, int> aktu; i=0; while(i<=dokad){ for(j=0; j<JakieDochodza[i].size(); j++){ Najlepsze.push( JakieDochodza[i][j] ); } wiel=Najlepsze.size(); for(j=0; j<min(wiel, m); j++){ aktu=Najlepsze.top(); a=-( aktu.first ); b=aktu.second; Ile[b]++; Najlepsze.pop(); if(i>=Wczytaj[b].first){ printf("NIE\n"); return; } if(Ile[b]<Wczytaj[b].second){ Dodaj.push_back( make_pair( -a, b) ); } } for(j=m; j<wiel; j++){ aktu=Najlepsze.top(); Najlepsze.pop(); Dodaj.push_back( make_pair( aktu.first-1, aktu.second ) ); } for(j=0; j<Dodaj.size(); j++){ Najlepsze.push( Dodaj[j] ); } while(!Dodaj.empty()){ Dodaj.pop_back(); } i++; } if(!Najlepsze.empty()){ printf("NIE\n"); return; } printf("TAK\n"); return; } int main (){ int n, m, ile; WczytajDane(n, m, ile); SprawdzWynik(n, m, ile); return 0; } |
English