#include <bits/stdc++.h>
using namespace std;
constexpr int LIMIT = 500007;
// first = numer
// second = i(d)
pair<int, int> tab[LIMIT];
long long prefix[LIMIT];
// odpowiedz dla danego i, 0 = N, 1 = T
bitset<LIMIT> odp;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> tab[i].first;
tab[i].second = i;
}
sort(tab, tab+n);
//for(int i = 0; i < n; i++) {
// cout << tab[i].first << " ";
//}
//cout << "\n";
prefix[0] = tab[0].first;
for(int i = 1; i < n; i++) {
prefix[i] = prefix[i-1] + tab[i].first;
}
//for(int i = 0; i < n; i++) {
// cout << prefix[i] << " ";
//}
int last = n-1;
odp[tab[last].second] = true;
for(int i = last-1; i >= 0; i--) {
if (tab[i].first == tab[last].first) {
odp[tab[i].second] = true;
last = i;
} else {
break;
}
}
if (last == 0) {
for(int i = 0; i < n; i++) {
cout << "N";
}
return 0;
}
//for(int i = 0; i < n; i++) {
// cout << odp[i] << " ";
//}
//cout << endl << endl;
int howmanytofix = 1;
last--;
for(int i = last; i > 0; i--) {
//cout << "i: " << i << " last: " << last << endl;;
if(tab[i-1].first == tab[last].first) {
//cout << i << ": Repeating digit" << endl;
howmanytofix++;
} else {
if (prefix[i] > tab[last+1].first) {
//cout << i << ": OMW" << endl;
for(int j = i; j < i+howmanytofix; j++) {
//cout << j << ": Fixed" << endl;
odp[tab[j].second] = true;
}
howmanytofix = 1;
last = i-1;
} else {
//cout << i << ": BREAK." << endl;
break;
}
}
}
//cout << "\n\n";
for(int i = 0; i < n; i++) {
cout << ((odp[i]) ? "T" : "N");
}
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 | #include <bits/stdc++.h> using namespace std; constexpr int LIMIT = 500007; // first = numer // second = i(d) pair<int, int> tab[LIMIT]; long long prefix[LIMIT]; // odpowiedz dla danego i, 0 = N, 1 = T bitset<LIMIT> odp; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i = 0; i < n; i++) { cin >> tab[i].first; tab[i].second = i; } sort(tab, tab+n); //for(int i = 0; i < n; i++) { // cout << tab[i].first << " "; //} //cout << "\n"; prefix[0] = tab[0].first; for(int i = 1; i < n; i++) { prefix[i] = prefix[i-1] + tab[i].first; } //for(int i = 0; i < n; i++) { // cout << prefix[i] << " "; //} int last = n-1; odp[tab[last].second] = true; for(int i = last-1; i >= 0; i--) { if (tab[i].first == tab[last].first) { odp[tab[i].second] = true; last = i; } else { break; } } if (last == 0) { for(int i = 0; i < n; i++) { cout << "N"; } return 0; } //for(int i = 0; i < n; i++) { // cout << odp[i] << " "; //} //cout << endl << endl; int howmanytofix = 1; last--; for(int i = last; i > 0; i--) { //cout << "i: " << i << " last: " << last << endl;; if(tab[i-1].first == tab[last].first) { //cout << i << ": Repeating digit" << endl; howmanytofix++; } else { if (prefix[i] > tab[last+1].first) { //cout << i << ": OMW" << endl; for(int j = i; j < i+howmanytofix; j++) { //cout << j << ": Fixed" << endl; odp[tab[j].second] = true; } howmanytofix = 1; last = i-1; } else { //cout << i << ": BREAK." << endl; break; } } } //cout << "\n\n"; for(int i = 0; i < n; i++) { cout << ((odp[i]) ? "T" : "N"); } return 0; } |
English