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