#include <cstdio> #include <map> #include <set> #include <vector> #include <utility> #include <algorithm> // std::sort #include <iostream> // std::sort std::map<long, std::vector<int>> sizeToIndexes; std::map<long, long long> sizeToSmallerOrEqualSize; bool * result; int n; void solve() { auto currentIter = sizeToSmallerOrEqualSize.rbegin(); long prevSize = currentIter->first; for (auto index: sizeToIndexes[currentIter->first]) { result[index] = true; } currentIter ++; while (currentIter->first != sizeToSmallerOrEqualSize.begin()->first) { if (sizeToSmallerOrEqualSize[currentIter->first] <= prevSize) { return; } for (auto index: sizeToIndexes[currentIter->first]) { result[index] = true; } prevSize = currentIter->first; currentIter ++; } } // for (auto iter = sizeToSmallerOrEqualSize.rbegin(); iter != sizeToSmallerOrEqualSize.rend(); ++iter) { // if (iter != sizeToSmallerOrEqualSize.begin()) { // } // } int main() { scanf("%d\n", &n); result = new bool[n]; for (int i=0; i < n; i++) { result[i] = false; long a; scanf("%ld", &a); auto it = sizeToIndexes.find(a); if (it == sizeToIndexes.end()) { std::vector<int> indexes; indexes.push_back(i); sizeToIndexes.insert(std::make_pair(a, indexes)); } else { it->second.push_back(i); } } // printf("size=%d\n", sizeToIndexes.size()); // for ( const auto &myPair : sizeToIndexes ) { // std::cout << myPair.first << ":"; // for (const auto &value : myPair.second) { // std::cout << value << " "; // } // std::cout << std::endl; // } long long smallerOrEqualSize = 0L; for ( const auto &myPair : sizeToIndexes ) { smallerOrEqualSize += (long) myPair.second.size() * (long) myPair.first; sizeToSmallerOrEqualSize.insert(std::make_pair(myPair.first, smallerOrEqualSize)); } // std::cout << " ---------------------- \n"; // for ( const auto &myPair : sizeToSmallerOrEqualSize ) { // std::cout << myPair.first << ":" << myPair.second << std::endl; // } if (sizeToSmallerOrEqualSize.size() > 1) { solve(); } for (int i=0; i<n; i++) { printf(result[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 | #include <cstdio> #include <map> #include <set> #include <vector> #include <utility> #include <algorithm> // std::sort #include <iostream> // std::sort std::map<long, std::vector<int>> sizeToIndexes; std::map<long, long long> sizeToSmallerOrEqualSize; bool * result; int n; void solve() { auto currentIter = sizeToSmallerOrEqualSize.rbegin(); long prevSize = currentIter->first; for (auto index: sizeToIndexes[currentIter->first]) { result[index] = true; } currentIter ++; while (currentIter->first != sizeToSmallerOrEqualSize.begin()->first) { if (sizeToSmallerOrEqualSize[currentIter->first] <= prevSize) { return; } for (auto index: sizeToIndexes[currentIter->first]) { result[index] = true; } prevSize = currentIter->first; currentIter ++; } } // for (auto iter = sizeToSmallerOrEqualSize.rbegin(); iter != sizeToSmallerOrEqualSize.rend(); ++iter) { // if (iter != sizeToSmallerOrEqualSize.begin()) { // } // } int main() { scanf("%d\n", &n); result = new bool[n]; for (int i=0; i < n; i++) { result[i] = false; long a; scanf("%ld", &a); auto it = sizeToIndexes.find(a); if (it == sizeToIndexes.end()) { std::vector<int> indexes; indexes.push_back(i); sizeToIndexes.insert(std::make_pair(a, indexes)); } else { it->second.push_back(i); } } // printf("size=%d\n", sizeToIndexes.size()); // for ( const auto &myPair : sizeToIndexes ) { // std::cout << myPair.first << ":"; // for (const auto &value : myPair.second) { // std::cout << value << " "; // } // std::cout << std::endl; // } long long smallerOrEqualSize = 0L; for ( const auto &myPair : sizeToIndexes ) { smallerOrEqualSize += (long) myPair.second.size() * (long) myPair.first; sizeToSmallerOrEqualSize.insert(std::make_pair(myPair.first, smallerOrEqualSize)); } // std::cout << " ---------------------- \n"; // for ( const auto &myPair : sizeToSmallerOrEqualSize ) { // std::cout << myPair.first << ":" << myPair.second << std::endl; // } if (sizeToSmallerOrEqualSize.size() > 1) { solve(); } for (int i=0; i<n; i++) { printf(result[i] ? "T" : "N"); } return 0; } |