#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cstdint>
using namespace std;
class Calc {
private:
const int n;
/** Tablica z danymi wejściowymi. Potrzebna, aby mieć kolejność danych na potrzeby wypisania wyniku */
int* input=new int[n];
/** Tablica, w której będą posortowane wpisy od najmniejszego */
int* sorted=new int[n];
private:
int minimal;
int64_t sum;
public:
Calc(int n): n(n), input(new int[n]), sorted(new int[n]) {
}
void read() {
for(int i=0;i<n;++i) {
int v;
cin>>v;
input[i]=sorted[i]=v;
}
}
void prepare() {
// Sortujemy według wielkości
sort(sorted, sorted+n);
}
void process(int weight, int items) {
const int64_t s=sum;
sum+=(int64_t)weight*(int64_t)items; // aktualizujemy sumę.
if(s==0) { // przerwa grupa wagowa
minimal=weight+1; // pierwsza grupa wagowa, nigdy nie może być finalną
return;
}
if(s<=weight) { // jeżeli suma wszystkich poprzednich jest mniejsza niż aktualna kategoria wagowa,
// to znaczy, że minimalna waga jest przynajmniej rozmiaru tej grupy wagowej
minimal=weight; // podnosimy poprzeczkę
}
}
void calc() {
minimal=0;
sum=0;
int weight=0;
int weightStart=-1;
for(int i=0;i<n;++i) {
const auto v=sorted[i];
if(weight==v) continue; // pomijamy dla takich samych wag, bo liczymy jako całość (grupę wagową)
if(weightStart>=0) {
process(weight, i-weightStart );
}
weight=v;
weightStart=i;
}
process(sorted[n-1], n-weightStart); // ostatnia grupa wagowa
}
void print() {
for(int i=0;i<n;++i) {
cout<<((input[i]>=minimal)?'T':'N');
}
cout<<endl;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// Wczytujemy dane
int n;
cin>>n;
Calc c(n);
c.read();
c.prepare();
c.calc();
c.print();
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 | #include <iostream> #include <map> #include <vector> #include <algorithm> #include <cstdint> using namespace std; class Calc { private: const int n; /** Tablica z danymi wejściowymi. Potrzebna, aby mieć kolejność danych na potrzeby wypisania wyniku */ int* input=new int[n]; /** Tablica, w której będą posortowane wpisy od najmniejszego */ int* sorted=new int[n]; private: int minimal; int64_t sum; public: Calc(int n): n(n), input(new int[n]), sorted(new int[n]) { } void read() { for(int i=0;i<n;++i) { int v; cin>>v; input[i]=sorted[i]=v; } } void prepare() { // Sortujemy według wielkości sort(sorted, sorted+n); } void process(int weight, int items) { const int64_t s=sum; sum+=(int64_t)weight*(int64_t)items; // aktualizujemy sumę. if(s==0) { // przerwa grupa wagowa minimal=weight+1; // pierwsza grupa wagowa, nigdy nie może być finalną return; } if(s<=weight) { // jeżeli suma wszystkich poprzednich jest mniejsza niż aktualna kategoria wagowa, // to znaczy, że minimalna waga jest przynajmniej rozmiaru tej grupy wagowej minimal=weight; // podnosimy poprzeczkę } } void calc() { minimal=0; sum=0; int weight=0; int weightStart=-1; for(int i=0;i<n;++i) { const auto v=sorted[i]; if(weight==v) continue; // pomijamy dla takich samych wag, bo liczymy jako całość (grupę wagową) if(weightStart>=0) { process(weight, i-weightStart ); } weight=v; weightStart=i; } process(sorted[n-1], n-weightStart); // ostatnia grupa wagowa } void print() { for(int i=0;i<n;++i) { cout<<((input[i]>=minimal)?'T':'N'); } cout<<endl; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // Wczytujemy dane int n; cin>>n; Calc c(n); c.read(); c.prepare(); c.calc(); c.print(); return 0; } |
English