Advertisement
pb_jiang

T4 TLE

Apr 27th, 2024
826
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int medianOfUniquenessArray(vector<int>& ns) {
  4.         vector<vector<int>> pos(1e5 + 1);
  5.         for (int i = 0; i < ns.size(); ++i) {
  6.             pos[ns[i]].push_back(i);
  7.         }
  8.         function<bool(int, int, int, int, int&, int)> get_gt_kc = [&](int beg, int end, int k, int cur_k, int& got, int need) {
  9.             if (beg + k > end) return false;
  10.             if (cur_k < k) return false;
  11.             ++got;
  12.             if (got >= need) return true;
  13.            
  14.             const auto& v1 = pos[ns[beg]], &v2 = pos[ns[end - 1]];
  15.             int i1 = upper_bound(v1.begin(), v1.end(), beg) - v1.begin();
  16.             int i2 = upper_bound(v2.begin(), v2.end(), beg) - v2.begin();
  17.             int opt1 = get_gt_kc(beg + 1, end, k, cur_k - (i1 >= end), got, need);
  18.             int opt2 = get_gt_kc(beg, end - 1, k, cur_k - (i2 >= end - 1), got, need);
  19.             return got >= need;
  20.         };
  21.         set<int> ss(ns.begin(), ns.end());
  22.         int n = ns.size(), ck = ss.size();
  23.         int lb = 0, ub = n, need = (n * (n + 1) / 2 + 1)/ 2;
  24.         while(lb + 1 <= ub) {
  25.             int mid = (lb + ub) / 2, got = 0;
  26.             if (get_gt_kc(0, n, mid, ck, got, need)) {
  27.                 ub = mid;
  28.             } else {
  29.                 lb = mid;
  30.             }
  31.         }
  32.         return ub;
  33.     }
  34. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement