danielvitor23

J - Rash Cloyale

Jul 13th, 2023 (edited)
1,185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using i64 = long long;
  5.  
  6. const i64 INF = 0x3f3f3f3f3f3f3f3fLL;
  7.  
  8. template<class T>
  9. class SegmentTree {
  10.     struct Node {
  11.         T val;
  12.         Node(T x) : val(x) {}
  13.         Node () : val(0) {}
  14.     };
  15.     int N;
  16.     std::vector<T> a;
  17.     std::vector<Node> tr;
  18.     Node neutral;
  19.     inline Node join(const Node &a, const Node &b) {
  20.         return max(a.val, b.val);
  21.     }
  22.     void build(int node, int l, int r) {
  23.         if (l == r) {
  24.             tr[node] = Node(a[l]);
  25.             return;
  26.         }
  27.         int mid = l+(r-l)/2, lc = (node << 1);
  28.         build(lc, l, mid);
  29.         build(lc+1, mid+1, r);
  30.         tr[node] = join(tr[lc], tr[lc+1]);
  31.     }
  32.     Node query(int node, int l, int r, int ql, int qr) {
  33.         if (r < l or qr < l or r < ql) return neutral;
  34.         if (ql <= l and r <= qr) return tr[node];
  35.         int mid = l+(r-l)/2, lc = (node << 1);
  36.         return join(query(lc, l, mid, ql, std::min(qr, mid)),
  37.                     query(lc+1, mid+1, r, std::max(mid+1, ql), qr));
  38.     }
  39. public:
  40.     template<class MyIterator>
  41.     SegmentTree (MyIterator begin, MyIterator end) {
  42.         N = end-begin-1;
  43.         tr.assign(4*N, 0);
  44.         a = std::vector<T>(begin, end);
  45.         build(1, 1, N);
  46.     }
  47.     SegmentTree (int n) : N(n) {
  48.         tr.assign(4*N, 0);
  49.         a.assign(N+1, 0);
  50.     }
  51.     T query(int l, int r) {
  52.         return query(1, 1, N, l, r).val;
  53.     }
  54. };
  55.  
  56. int main() {
  57.   cin.tie(0)->sync_with_stdio(0);
  58.  
  59.   int n; cin >> n;
  60.  
  61.   vector<i64> a(n + 1), b(n + 1), c;
  62.  
  63.   for (int i = 1; i <= n; ++i) {
  64.     cin >> a[i];
  65.   }
  66.   for (int i = 1; i <= n; ++i) {
  67.     cin >> b[i];
  68.   }
  69.  
  70.   if (n == 1) {
  71.     cout << a[0]+b[0] << '\n';
  72.     return 0;
  73.   }
  74.  
  75.   sort(a.begin(), a.end());
  76.   sort(b.begin(), b.end());
  77.  
  78.   c = b;
  79.   reverse(c.begin() + 1, c.end());
  80.  
  81.   i64 answer = INF;
  82.  
  83.   vector<i64> d1(n + 1), d2(n + 1);
  84.  
  85.   for (int i = 1; i <= n; ++i) {
  86.     d1[i] = a[i] + c[i];
  87.   }
  88.  
  89.   d2[1] = a[1];
  90.   for (int i = 2; i <= n; ++i) {
  91.     d2[i] = a[i] + c[i - 1];
  92.   }
  93.  
  94.   SegmentTree<int> S1(d1.begin(), d1.end());
  95.   SegmentTree<int> S2(d2.begin(), d2.end());
  96.  
  97.   // for (int i = 1; i <= n; ++i) {
  98.   //   cout << S1.query(i, i) << " \n"[i==n];
  99.   // }
  100.  
  101.   // for (int i = 1; i <= n; ++i) {
  102.   //   cout << S2.query(i, i) << " \n"[i==n];
  103.   // }
  104.  
  105.   for (int i = 1; i <= n; i++) {
  106.     int lo = 1, hi = n, ans = -1;
  107.  
  108.     while (lo <= hi) {
  109.       int mid = (lo + hi)/2;
  110.  
  111.       i64 sum = a[i] + b[mid];
  112.  
  113.       mid = n - mid + 1;
  114.  
  115.       i64 mx = (
  116.         i == mid
  117.         ? max(S1.query(1, i-1), S1.query(i+1, n))
  118.         : max({ S1.query(1, min(i, mid)-1), S1.query(max(i, mid)+1, n), S2.query(min(i, mid) + 1, max(i, mid)) })
  119.       );
  120.  
  121.       // cout << mid << " -> " << mx << '\n';
  122.  
  123.       mid = n - mid + 1;
  124.  
  125.       if (sum >= mx) {
  126.         ans = mid;
  127.         hi = mid - 1;
  128.       } else {
  129.         lo = mid + 1;
  130.       }
  131.     }
  132.  
  133.     if (ans == -1) continue;
  134.  
  135.     // cout << i << " -> " << a[i] << " " << b[ans] << '\n';
  136.  
  137.     // mid
  138.     answer = min(answer, a[i] + b[ans]);
  139.   }
  140.  
  141.   cout << (answer == INF ? a.back()+b.back() : answer) << '\n';
  142. }
Advertisement
Add Comment
Please, Sign In to add comment