#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct S : pair<int, int> {
S(int w, int idx) : pair<int,int>{w, idx}, maxw{w}, sum{w} {}
S() {}
int w() { return first; }
int idx() { return second; }
bool king{true};
long long maxw;
long long sum;
};
struct Sorter {
Sorter(const vector<S> &v_) : v(v_) {}
const vector<S> &v;
bool operator()(int lhs, int rhs) {
return v[lhs].first < v[rhs].first;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<S> v;
v.reserve(N);
vector<int> vi;
vi.reserve(N);
for (int i = 0; i < N; i++) {
int a;
cin >> a;
v.push_back(S{a, i});
vi.push_back(i);
}
sort(vi.begin(), vi.end(), Sorter(v));
v[vi[0]].king = false;
for (int i = 1; i < N; i++) {
if (v[vi[i]].w() > v[vi[i-1]].w() || (v[vi[i]].w() == v[vi[i-1]].w() && v[vi[i-1]].maxw > v[vi[i-1]].w())) {
v[vi[i]].maxw += v[vi[i-1]].sum;
}
v[vi[i]].sum += v[vi[i-1]].sum;
}
S &last = v[vi[N-1]];
S &second_to_last = v[vi[N-2]];
bool still = last.maxw > second_to_last.w();
for (int i = N-1; i > 0; i--) {
v[vi[i]].king = still;
if (v[vi[i-1]].maxw <= v[vi[i]].w())
still = false;
}
string vc;
vc.resize(N, 'T');
for (auto &i: v)
if (!i.king) vc[i.idx()] = 'N';
cout << vc << endl;
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 | #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; struct S : pair<int, int> { S(int w, int idx) : pair<int,int>{w, idx}, maxw{w}, sum{w} {} S() {} int w() { return first; } int idx() { return second; } bool king{true}; long long maxw; long long sum; }; struct Sorter { Sorter(const vector<S> &v_) : v(v_) {} const vector<S> &v; bool operator()(int lhs, int rhs) { return v[lhs].first < v[rhs].first; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; cin >> N; vector<S> v; v.reserve(N); vector<int> vi; vi.reserve(N); for (int i = 0; i < N; i++) { int a; cin >> a; v.push_back(S{a, i}); vi.push_back(i); } sort(vi.begin(), vi.end(), Sorter(v)); v[vi[0]].king = false; for (int i = 1; i < N; i++) { if (v[vi[i]].w() > v[vi[i-1]].w() || (v[vi[i]].w() == v[vi[i-1]].w() && v[vi[i-1]].maxw > v[vi[i-1]].w())) { v[vi[i]].maxw += v[vi[i-1]].sum; } v[vi[i]].sum += v[vi[i-1]].sum; } S &last = v[vi[N-1]]; S &second_to_last = v[vi[N-2]]; bool still = last.maxw > second_to_last.w(); for (int i = N-1; i > 0; i--) { v[vi[i]].king = still; if (v[vi[i-1]].maxw <= v[vi[i]].w()) still = false; } string vc; vc.resize(N, 'T'); for (auto &i: v) if (!i.king) vc[i.idx()] = 'N'; cout << vc << endl; return 0; } |
English