#include <iostream> #include <set> #include <vector> #include <algorithm> #include <cstring> using namespace std; #ifdef _HOME_ #define DEBUG(x) x #else #define DEBUG(x) #endif #define REP(x,n) for(int x=0;x<(n);++x) #define FOREACH(x,n) for(__typeof(n.begin()) x = (n).begin(); x != (n).end(); ++x) #define RESULT(x) {cout<<(x);return 0;} const int MAX_N = 500001; int in[MAX_N]; int tab[MAX_N]; long long sum[MAX_N]; int n; int getSmallestKing() { if (tab[0] == tab[n-1]) // all same size - noone can be king return 2000000000; //at least 2 different sizes - always at least 1 king int lastKing = n-1; for(int i=n-2;i>=0;--i) { while(i>=0 && tab[i+1]==tab[i]) --i; if (i==-1 || tab[0]==tab[i]) { DEBUG(cerr<<"Stop - all except smallest can be king"<<endl;) break; } if ((long long)(tab[i]+sum[i]) <= tab[lastKing]) { DEBUG(cerr<<"Stop - fish "<<tab[i]<<" can be at max "<<tab[i]+sum[i]<<" < "<<tab[lastKing]<<endl;) break; } DEBUG(cerr<<tab[i]<<" can be king - "<<tab[i]+sum[i]<<">"<<tab[lastKing]<<endl;) lastKing = i; } return tab[lastKing]; } int main() { ios_base::sync_with_stdio(0); cin>>n; REP(x,n) { cin >> tab[x]; } memcpy(in, tab, n*sizeof(int)); DEBUG( REP(x,n) if (in[x] != tab[x]) { cerr << "ERROR at index ["<<x<<"] - expected "<<tab[x]<<", got "<<in[x] << endl; return 1; } ) sort(tab, tab+n, std::less<int>()); sum[0] = 0; REP(x,n-1) sum[x+1] = sum[x]+tab[x]; DEBUG( REP(x,n) cerr << sum[x] << " "; cerr << endl; ) int smallestKing = getSmallestKing(); REP(x,n) cout << (in[x]<smallestKing ? "N" : "T"); 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 | #include <iostream> #include <set> #include <vector> #include <algorithm> #include <cstring> using namespace std; #ifdef _HOME_ #define DEBUG(x) x #else #define DEBUG(x) #endif #define REP(x,n) for(int x=0;x<(n);++x) #define FOREACH(x,n) for(__typeof(n.begin()) x = (n).begin(); x != (n).end(); ++x) #define RESULT(x) {cout<<(x);return 0;} const int MAX_N = 500001; int in[MAX_N]; int tab[MAX_N]; long long sum[MAX_N]; int n; int getSmallestKing() { if (tab[0] == tab[n-1]) // all same size - noone can be king return 2000000000; //at least 2 different sizes - always at least 1 king int lastKing = n-1; for(int i=n-2;i>=0;--i) { while(i>=0 && tab[i+1]==tab[i]) --i; if (i==-1 || tab[0]==tab[i]) { DEBUG(cerr<<"Stop - all except smallest can be king"<<endl;) break; } if ((long long)(tab[i]+sum[i]) <= tab[lastKing]) { DEBUG(cerr<<"Stop - fish "<<tab[i]<<" can be at max "<<tab[i]+sum[i]<<" < "<<tab[lastKing]<<endl;) break; } DEBUG(cerr<<tab[i]<<" can be king - "<<tab[i]+sum[i]<<">"<<tab[lastKing]<<endl;) lastKing = i; } return tab[lastKing]; } int main() { ios_base::sync_with_stdio(0); cin>>n; REP(x,n) { cin >> tab[x]; } memcpy(in, tab, n*sizeof(int)); DEBUG( REP(x,n) if (in[x] != tab[x]) { cerr << "ERROR at index ["<<x<<"] - expected "<<tab[x]<<", got "<<in[x] << endl; return 1; } ) sort(tab, tab+n, std::less<int>()); sum[0] = 0; REP(x,n-1) sum[x+1] = sum[x]+tab[x]; DEBUG( REP(x,n) cerr << sum[x] << " "; cerr << endl; ) int smallestKing = getSmallestKing(); REP(x,n) cout << (in[x]<smallestKing ? "N" : "T"); return 0; } |