#include <bits/stdc++.h>
#define FOR(i,n) for(int i = 0; i<n; ++i)
#define FOREACH(v, a) for(auto & v : (a))
#define X first
#define Y second
#define PR std::pair
#define MPR std::make_pair
typedef long long ll;
typedef std::vector<int> VI;
using namespace std;
#pragma region Ready functions
int fastPower(int a, int b){
int res=1, pop_a = a;
while(b){
if(b&1) res *= pop_a;
pop_a *= pop_a;
b>>=1;
}
return res;
}
#pragma endregion
vector<pair<ll,int>> nums;
map<int, ll> sums;
bool king[500001];
void CalculateSums(){
int lastNum = -1;
int currentNum = nums[0].first;
sums[nums[0].first] = nums[0].first;
for(int i = 1; i<nums.size(); i++){
if(currentNum != nums[i].first){
sums[nums[i].first] = sums[currentNum] + nums[i].first;
currentNum = nums[i].first;
continue;
}
sums[currentNum] += currentNum;
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int n;
cin>>n;
ll minimum = 99999999999;
ll maksimum = 0;
for(int i = 0; i<n; i++){
ll x;
cin>>x;
nums.push_back({x, i});
minimum = min(minimum, x);
maksimum = max(maksimum, x);
}
if(minimum == maksimum){
FOR(i, n) cout<<'N';
return 0;
}
sort(nums.begin(), nums.end());
CalculateSums();
int lastNum = maksimum;
int currentNum = maksimum;
bool failing = true;
for(int i = n-1; i>=0; i--){
if(nums[i].first < currentNum){
lastNum = currentNum;
currentNum = nums[i].first;
}
if(nums[i].first == minimum) failing = false;
else{
//get the sum of all elements <= x
//and check if its bigger than the next
if(sums[currentNum] <= lastNum){
king[nums[i].second] = false;
failing = false;
}
}
king[nums[i].second] = failing;
//cout<<currentNum<<" "<<sums[currentNum]<<endl;
}
for(int i = 0; i<n; i++){
cout<<(king[i] == 0 ? 'N' : 'T');
}
}
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 | #include <bits/stdc++.h> #define FOR(i,n) for(int i = 0; i<n; ++i) #define FOREACH(v, a) for(auto & v : (a)) #define X first #define Y second #define PR std::pair #define MPR std::make_pair typedef long long ll; typedef std::vector<int> VI; using namespace std; #pragma region Ready functions int fastPower(int a, int b){ int res=1, pop_a = a; while(b){ if(b&1) res *= pop_a; pop_a *= pop_a; b>>=1; } return res; } #pragma endregion vector<pair<ll,int>> nums; map<int, ll> sums; bool king[500001]; void CalculateSums(){ int lastNum = -1; int currentNum = nums[0].first; sums[nums[0].first] = nums[0].first; for(int i = 1; i<nums.size(); i++){ if(currentNum != nums[i].first){ sums[nums[i].first] = sums[currentNum] + nums[i].first; currentNum = nums[i].first; continue; } sums[currentNum] += currentNum; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; ll minimum = 99999999999; ll maksimum = 0; for(int i = 0; i<n; i++){ ll x; cin>>x; nums.push_back({x, i}); minimum = min(minimum, x); maksimum = max(maksimum, x); } if(minimum == maksimum){ FOR(i, n) cout<<'N'; return 0; } sort(nums.begin(), nums.end()); CalculateSums(); int lastNum = maksimum; int currentNum = maksimum; bool failing = true; for(int i = n-1; i>=0; i--){ if(nums[i].first < currentNum){ lastNum = currentNum; currentNum = nums[i].first; } if(nums[i].first == minimum) failing = false; else{ //get the sum of all elements <= x //and check if its bigger than the next if(sums[currentNum] <= lastNum){ king[nums[i].second] = false; failing = false; } } king[nums[i].second] = failing; //cout<<currentNum<<" "<<sums[currentNum]<<endl; } for(int i = 0; i<n; i++){ cout<<(king[i] == 0 ? 'N' : 'T'); } } |
English