#include <bits/stdc++.h>
using namespace std;
struct TestCase
{
size_t fish_count;
vector<size_t> fish_sizes;
};
TestCase read_test_case();
void solve_test_case(const TestCase&);
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
solve_test_case(read_test_case());
}
TestCase read_test_case()
{
TestCase tc;
cin >> tc.fish_count;
tc.fish_sizes.resize(tc.fish_count);
for (auto& fish : tc.fish_sizes) cin >> fish;
return tc;
}
typedef unsigned long long fish_size_t;
struct Fish
{
size_t index;
fish_size_t size;
};
struct Shoal
{
vector<Fish> fish;
fish_size_t fish_size;
size_t size;
};
bool operator<(const Shoal& lhs, const Shoal& rhs)
{
return lhs.fish_size < rhs.fish_size;
}
vector<Shoal> make_shoals(const TestCase& tc)
{
map<size_t, Shoal> size_to_shoal;
for (size_t i = 0; i < tc.fish_count; i++)
{
size_to_shoal[tc.fish_sizes[i]].fish.push_back({i, tc.fish_sizes[i]});
size_to_shoal[tc.fish_sizes[i]].fish_size = tc.fish_sizes[i];
size_to_shoal[tc.fish_sizes[i]].size++;
}
vector<Shoal> shoals;
for (auto [_, shoal] : size_to_shoal) shoals.push_back(shoal);
sort(shoals.begin(), shoals.end());
return shoals;
}
void mark_shoal_true(const Shoal& shoal, vector<bool>& can_become_king)
{
for (const auto& fish : shoal.fish) can_become_king[fish.index] = true;
}
void solve_test_case(const TestCase& tc)
{
auto shoals = make_shoals(tc);
vector<fish_size_t> size_of_all_fish_to(shoals.size() + 1);
size_of_all_fish_to[0] = 0;
for (size_t i = 0; i < shoals.size(); i++)
size_of_all_fish_to[i + 1] =
size_of_all_fish_to[i] +
static_cast<fish_size_t>(shoals[i].size) * shoals[i].fish_size;
vector<bool> can_become_king(tc.fish_count, false);
vector<fish_size_t> eaten_fish(shoals.size(), 0);
for (size_t i = 1; i < shoals.size(); i++)
{
if (eaten_fish[i - 1] > i)
{
eaten_fish[i] = eaten_fish[i - 1];
continue;
}
fish_size_t size = size_of_all_fish_to[i + 1];
size_t j = i;
while (j + 1 < shoals.size() and size > shoals[j + 1].fish_size)
{
size += shoals[j + 1].fish_size * shoals[j + 1].size;
j++;
}
eaten_fish[i] = j + 1;
}
if (tc.fish_count == 1) can_become_king[0] = true;
for (size_t i = 0; i < shoals.size(); i++)
{
auto size = size_of_all_fish_to[eaten_fish[i]];
if (size > shoals[shoals.size() - 1].fish_size)
mark_shoal_true(shoals[i], can_become_king);
}
for (auto b : can_become_king) cout << (b ? "T" : "N");
cout << "\n";
}
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <bits/stdc++.h> using namespace std; struct TestCase { size_t fish_count; vector<size_t> fish_sizes; }; TestCase read_test_case(); void solve_test_case(const TestCase&); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve_test_case(read_test_case()); } TestCase read_test_case() { TestCase tc; cin >> tc.fish_count; tc.fish_sizes.resize(tc.fish_count); for (auto& fish : tc.fish_sizes) cin >> fish; return tc; } typedef unsigned long long fish_size_t; struct Fish { size_t index; fish_size_t size; }; struct Shoal { vector<Fish> fish; fish_size_t fish_size; size_t size; }; bool operator<(const Shoal& lhs, const Shoal& rhs) { return lhs.fish_size < rhs.fish_size; } vector<Shoal> make_shoals(const TestCase& tc) { map<size_t, Shoal> size_to_shoal; for (size_t i = 0; i < tc.fish_count; i++) { size_to_shoal[tc.fish_sizes[i]].fish.push_back({i, tc.fish_sizes[i]}); size_to_shoal[tc.fish_sizes[i]].fish_size = tc.fish_sizes[i]; size_to_shoal[tc.fish_sizes[i]].size++; } vector<Shoal> shoals; for (auto [_, shoal] : size_to_shoal) shoals.push_back(shoal); sort(shoals.begin(), shoals.end()); return shoals; } void mark_shoal_true(const Shoal& shoal, vector<bool>& can_become_king) { for (const auto& fish : shoal.fish) can_become_king[fish.index] = true; } void solve_test_case(const TestCase& tc) { auto shoals = make_shoals(tc); vector<fish_size_t> size_of_all_fish_to(shoals.size() + 1); size_of_all_fish_to[0] = 0; for (size_t i = 0; i < shoals.size(); i++) size_of_all_fish_to[i + 1] = size_of_all_fish_to[i] + static_cast<fish_size_t>(shoals[i].size) * shoals[i].fish_size; vector<bool> can_become_king(tc.fish_count, false); vector<fish_size_t> eaten_fish(shoals.size(), 0); for (size_t i = 1; i < shoals.size(); i++) { if (eaten_fish[i - 1] > i) { eaten_fish[i] = eaten_fish[i - 1]; continue; } fish_size_t size = size_of_all_fish_to[i + 1]; size_t j = i; while (j + 1 < shoals.size() and size > shoals[j + 1].fish_size) { size += shoals[j + 1].fish_size * shoals[j + 1].size; j++; } eaten_fish[i] = j + 1; } if (tc.fish_count == 1) can_become_king[0] = true; for (size_t i = 0; i < shoals.size(); i++) { auto size = size_of_all_fish_to[eaten_fish[i]]; if (size > shoals[shoals.size() - 1].fish_size) mark_shoal_true(shoals[i], can_become_king); } for (auto b : can_become_king) cout << (b ? "T" : "N"); cout << "\n"; } |
English