답안 #1074507

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1074507 2024-08-25T10:52:14 Z joelgun14 Growing Vegetables is Fun 5 (JOI24_vegetables5) C++17
100 / 100
3975 ms 48052 KB
// header file
#include <bits/stdc++.h>
// pragma
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC opitmize("Ofast")
#pragma GCC opitmize("unroll-loops")
// macros
#define endl "\n"
#define ll long long
#define mp make_pair
#define ins insert
#define lb lower_bound
#define pb push_back
#define ub upper_bound
#define lll __int128
#define fi first
#define se second
using namespace std;
const int lim = 6e5 + 5;
struct fenwick {
  int a[lim];
  fenwick() {
    memset(a, 0, sizeof(a));
  }
  void update(int idx, int val) {
    // cerr << idx << endl;
    while(idx < lim) {
      a[idx] += val;
      idx += idx&-idx;
    }
  }
  void update(int l, int r, int val) {
    if(l <=r) {
      update(l, val);
      update(r + 1, -val);
    }
  }
  int query(int idx) {
    int res = 0;
    while(idx) {
      res += a[idx];
      idx -= idx&-idx;
    }
    return res;
  }
} cur;
struct disjoint_setr {
  int h[lim];
  void reset() {
    memset(h, -1, sizeof(h));
  }
  disjoint_setr() {
    reset();
  }
  int nxt(int x) {
    return h[x] == -1 ? x : h[x] = nxt(h[x]);
  }
  void erase(int x) {
    merge(x, x + 1);
  }
  void merge(int x, int y) {
    x = nxt(x), y = nxt(y);
    if(x != y) {
      if(x < y)
        swap(x, y);
      h[y] = x;
    }
  }
} redr, bluer;
struct disjoint_setl {
  int h[lim];
  void reset() {
    memset(h, -1, sizeof(h));
  }
  disjoint_setl() {
    reset();
  }
  int prv(int x) {
    return h[x] == -1 ? x : h[x] = prv(h[x]);
  }
  void erase(int x) {
    merge(x - 1, x);
  }
  void merge(int x, int y) {
    x = prv(x), y = prv(y);
    if(x != y) {
      if(x > y)
        swap(x, y);
      h[y] = x;
    }
  }
} redl, bluel;
int main() {
  ios_base::sync_with_stdio(0); cin.tie(NULL);
  int n;
  cin >> n;
  int a[2 * n + 5];
  for(int i = 1; i <= 2 * n; ++i)
    cin >> a[i];
  int b[n + 5], c[n + 5];
  for(int i = 1; i <= n; ++i)
    cin >> b[i];
  for(int i = 1; i <= n; ++i)
    cin >> c[i];
  sort(b + 1, b + n + 1);
  sort(c + 1, c + n + 1);
  int l = 0, r = 1e9, res = -1;
  vector<pair<int, int>> v;
  for(int i = 1; i <= 2 * n; ++i)
    v.pb(mp(a[i], i));
  sort(v.begin(), v.end());
  pair<int, int> validb[2 * n + 5], validr[2 * n + 5];
  while(l <= r) {
    memset(cur.a, 0, sizeof(cur.a));
    redl.reset();
    redr.reset();
    bluel.reset();
    bluer.reset();
    int mid = (l + r) >> 1;
    // max diff -> mid
    // try each partition what is the max diff
    // nanti ada banyak validity test, tinggal cek validity testnya mana aja
    int b1 = 1, b2 = 1, r1 = 1, r2 = 1;
    for(auto p : v) {
      // cerr << p.fi << " " << mid << " " << b[b1] << endl;
      b2 = max(b2, 1), r2 = max(r2, 1);
      while(b1 <= n && p.fi - mid > b[b1])
        ++b1;
      while(b2 <= n && p.fi + mid >= b[b2])
        ++b2;
      while(r1 <= n && p.fi - mid > c[r1])
        ++r1;
      while(r2 <= n && p.fi + mid >= c[r2])
        ++r2;
      validb[p.se] = mp(b1, b2 - 1);
      validr[p.se] = mp(r1, r2 - 1);
      // cerr << b1 << " " << b2 << " " << r1 << " " << r2 << endl;
    }
    // for(int i = 1; i <= 2 * n; ++i) {
    //   // idx of element >= a[i] - mid
    //   validb[i].fi = lower_bound(b + 1, b + n + 1, a[i] - mid) - b;
    //   // idx of element <= a[i] + mid
    //   validb[i].se = upper_bound(b + 1, b + n + 1, a[i] + mid) - b - 1;
    //   // idx of element >= a[i] - mid
    //   validr[i].fi = lower_bound(c + 1, c + n + 1, a[i] - mid) - c;
    //   // idx of element <= a[i] + mid
    //   validr[i].se = upper_bound(c + 1, c + n + 1, a[i] + mid) - c - 1;
    //   // if(mid == 1) {
    //   //   cerr << a[i] + mid << " " << upper_bound(c + 1, c + n + 1, a[i] + mid) - c - 1 << " " << validr[i].se << endl;
    //   // }
    // }
    // cerr << "TEST" << endl;
    for(auto p : v) {
      // process
      // cerr << "UPDATE" << endl;
      cur.update(max(1, p.se - n + 1), p.se, 1);
      // observe that blue on left/right of that segment can be invalid
      int idx = p.se;
      // cerr << "TEST" << endl;
      int val;
      while((val = bluer.nxt(max(1, p.se - n + 1))) <= p.se && val > 0) {
        int tmp2 = cur.query(val);
        if(tmp2 < validb[idx].fi || tmp2 > validb[idx].se)
          bluer.erase(val), bluel.erase(val);
        else
          break;
      }
      while((val = bluel.prv(p.se)) >= max(1, p.se - n + 1)) {
        int tmp2 = cur.query(val);
        if(tmp2 < validb[idx].fi || tmp2 > validb[idx].se)
          bluer.erase(val), bluel.erase(val);
        else
          break;
      }
      // cerr << "DONE" << endl;
      if(p.se <= n) {
        cur.update(p.se + n + 1, 2 * n, 1);
        // observe that blue on left/right of that segment can be invalid
        while((val = bluer.nxt(p.se + n + 1)) <= 2 * n) {
          // cerr << val << endl;
          int tmp2 = cur.query(val);
          // cerr << "AFTER" << endl;
          if(tmp2 < validb[idx].fi || tmp2 > validb[idx].se) {
            bluer.erase(val), bluel.erase(val);
            // cerr << "HERE" << endl;
          }
          else
            break;
        }
        // cerr << "CHECK" << endl;
        while((val = bluel.prv(2 * n)) >= p.se + n + 1) {
          // cerr << val << endl;
          int tmp2 = cur.query(val);
          if(tmp2 < validb[idx].fi || tmp2 > validb[idx].se)
            bluer.erase(val), bluel.erase(val);
          else
            break;
        } 
      }
      // cerr << "TEST2" << endl;
      while((val = redr.nxt(max(1, p.se - n + 1))) <= p.se && val > 0) {
        // cerr << "check " << *it << " due to " << p.se << " " << cur.query(*it) << " " << validr[idx].fi << endl; 
        int tmp2 = cur.query(val);
        if(tmp2 < validr[idx].fi || tmp2 > validr[idx].se)
          redr.erase(val), redl.erase(val);
        else
          break;
      }
      while((val = redl.prv(p.se)) >= max(1, p.se - n + 1)) {
        // cerr << "check " << *it << " due to " << p.se << " " << cur.query(*it) << " " << validr[idx].se << endl; 
        int tmp2 = cur.query(val);
        if(tmp2 < validr[idx].fi || tmp2 > validr[idx].se)
          redr.erase(val), redl.erase(val);
        else
          break;
      }
      if(p.se <= n) {
        // observe that red on left/right of that segment can be invalid
        while((val = redr.nxt(p.se + n + 1)) <= 2 * n) {
          // cerr << "check " << *it << " due to " << p.se << " " << cur.query(*it) << " " << validr[idx].fi << endl; 
          int tmp2 = cur.query(val);
          if(tmp2 < validr[idx].fi || tmp2 > validr[idx].se)
            redr.erase(val), redl.erase(val);
          else
            break;
        }
        while((val = redl.prv(2 * n)) >= p.se + n + 1) {
          // cerr << "check " << *it << " due to " << p.se << " " << cur.query(*it) << " " << validr[idx].se << endl; 
          int tmp2 = cur.query(val);
          if(tmp2 < validr[idx].fi || tmp2 > validr[idx].se)
            redr.erase(val), redl.erase(val);
          else
            break;
        } 
      }
      // cerr << "FINISH" << endl;
    }
    // blue and red have to complement each other
    bool ans = 0;
    // cerr << "MID IS " << mid << endl;
    for(int i = 1; i + n <= 2 * n; ++i) {
      // cerr << i << " " << i + n << endl;
      // cerr << bluel.prv(i) << " " << bluel.prv(i + n) << endl;
      // cerr << redl.prv(i) << " " << redl.prv(i + n) << endl;
      if((bluel.prv(i) == i && redl.prv(i + n) == i + n) || (redl.prv(i) == i && bluel.prv(i + n) == i + n))
        ans = 1;
      // cerr << "DONE" << endl;
    }
    /*
    if(mid <= 20) {
      cerr << "DEBUG " << mid << endl;
      for(auto x : red) {
        cerr << x << " ";
      }
      cerr << endl;
      for(auto x : blue) {
        cerr << x << " ";
      }
      cerr << endl;
    }
    */
    if(ans) 
      r = mid - 1, res = mid;
    else
      l = mid + 1;
  }
  cout << res << endl;
  // choose a contiguous segment L to R such that we use one color
  // N^2 approach -> pair greedily (sorted)
  // int res = 1e9;
  // for(int i = 1; i + n <= 2 * n + 1; ++i) {
  //   vector<int> blue, red;
  //   for(int j = 1; j < i; ++j) {
  //     blue.pb(a[j]);
  //   }
  //   for(int j = i; j < i + n; ++j) {
  //     red.pb(a[j]);
  //   }
  //   for(int j = i + n; j <= 2 * n; ++j) {
  //     blue.pb(a[j]);
  //   }
  //   sort(blue.begin(), blue.end());
  //   sort(red.begin(), red.end());
  //   int mx = 0;
  //   for(int k = 1; k <= n; ++k) {
  //     mx = max({mx, abs(blue[k - 1] - b[k]), abs(red[k - 1] - c[k])});
  //   }
  //   res = min(res, mx);
  //   mx = 0;
  //   swap(red, blue);
  //   for(int k = 1; k <= n; ++k) {
  //     mx = max({mx, abs(blue[k - 1] - b[k]), abs(red[k - 1] - c[k])});
  //   }
  //   res = min(res, mx);
  // }
  // cout << res << endl;
  return 0;
}

Compilation message

Main.cpp:5: warning: ignoring '#pragma GCC opitmize' [-Wunknown-pragmas]
    5 | #pragma GCC opitmize("Ofast")
      | 
Main.cpp:6: warning: ignoring '#pragma GCC opitmize' [-Wunknown-pragmas]
    6 | #pragma GCC opitmize("unroll-loops")
      |
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 12120 KB Output is correct
2 Correct 13 ms 12124 KB Output is correct
3 Correct 13 ms 12200 KB Output is correct
4 Correct 13 ms 12124 KB Output is correct
5 Correct 13 ms 12200 KB Output is correct
6 Correct 12 ms 12200 KB Output is correct
7 Correct 16 ms 12120 KB Output is correct
8 Correct 14 ms 12124 KB Output is correct
9 Correct 13 ms 12124 KB Output is correct
10 Correct 12 ms 12124 KB Output is correct
11 Correct 13 ms 12120 KB Output is correct
12 Correct 14 ms 12124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 12120 KB Output is correct
2 Correct 13 ms 12124 KB Output is correct
3 Correct 13 ms 12200 KB Output is correct
4 Correct 13 ms 12124 KB Output is correct
5 Correct 13 ms 12200 KB Output is correct
6 Correct 12 ms 12200 KB Output is correct
7 Correct 16 ms 12120 KB Output is correct
8 Correct 14 ms 12124 KB Output is correct
9 Correct 13 ms 12124 KB Output is correct
10 Correct 12 ms 12124 KB Output is correct
11 Correct 13 ms 12120 KB Output is correct
12 Correct 14 ms 12124 KB Output is correct
13 Correct 13 ms 12128 KB Output is correct
14 Correct 13 ms 12132 KB Output is correct
15 Correct 13 ms 12120 KB Output is correct
16 Correct 13 ms 12124 KB Output is correct
17 Correct 12 ms 12192 KB Output is correct
18 Correct 15 ms 12120 KB Output is correct
19 Correct 17 ms 12152 KB Output is correct
20 Correct 16 ms 12124 KB Output is correct
21 Correct 15 ms 12124 KB Output is correct
22 Correct 14 ms 12196 KB Output is correct
23 Correct 14 ms 12132 KB Output is correct
24 Correct 18 ms 12120 KB Output is correct
25 Correct 15 ms 12120 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 12120 KB Output is correct
2 Correct 13 ms 12124 KB Output is correct
3 Correct 13 ms 12200 KB Output is correct
4 Correct 13 ms 12124 KB Output is correct
5 Correct 13 ms 12200 KB Output is correct
6 Correct 12 ms 12200 KB Output is correct
7 Correct 16 ms 12120 KB Output is correct
8 Correct 14 ms 12124 KB Output is correct
9 Correct 13 ms 12124 KB Output is correct
10 Correct 12 ms 12124 KB Output is correct
11 Correct 13 ms 12120 KB Output is correct
12 Correct 14 ms 12124 KB Output is correct
13 Correct 13 ms 12128 KB Output is correct
14 Correct 13 ms 12132 KB Output is correct
15 Correct 13 ms 12120 KB Output is correct
16 Correct 13 ms 12124 KB Output is correct
17 Correct 12 ms 12192 KB Output is correct
18 Correct 15 ms 12120 KB Output is correct
19 Correct 17 ms 12152 KB Output is correct
20 Correct 16 ms 12124 KB Output is correct
21 Correct 15 ms 12124 KB Output is correct
22 Correct 14 ms 12196 KB Output is correct
23 Correct 14 ms 12132 KB Output is correct
24 Correct 18 ms 12120 KB Output is correct
25 Correct 15 ms 12120 KB Output is correct
26 Correct 45 ms 12380 KB Output is correct
27 Correct 33 ms 12388 KB Output is correct
28 Correct 31 ms 12376 KB Output is correct
29 Correct 17 ms 12124 KB Output is correct
30 Correct 42 ms 12204 KB Output is correct
31 Correct 40 ms 12376 KB Output is correct
32 Correct 25 ms 12292 KB Output is correct
33 Correct 23 ms 12124 KB Output is correct
34 Correct 35 ms 12632 KB Output is correct
35 Correct 33 ms 12412 KB Output is correct
36 Correct 43 ms 12540 KB Output is correct
37 Correct 31 ms 12380 KB Output is correct
38 Correct 33 ms 12376 KB Output is correct
39 Correct 33 ms 12440 KB Output is correct
40 Correct 37 ms 12380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3273 ms 45192 KB Output is correct
2 Correct 3047 ms 42420 KB Output is correct
3 Correct 2854 ms 37564 KB Output is correct
4 Correct 2833 ms 47316 KB Output is correct
5 Correct 2926 ms 43652 KB Output is correct
6 Correct 105 ms 13268 KB Output is correct
7 Correct 2557 ms 48052 KB Output is correct
8 Correct 2885 ms 38076 KB Output is correct
9 Correct 2894 ms 47284 KB Output is correct
10 Correct 2962 ms 47284 KB Output is correct
11 Correct 2848 ms 47284 KB Output is correct
12 Correct 3171 ms 45108 KB Output is correct
13 Correct 3009 ms 43700 KB Output is correct
14 Correct 3305 ms 46216 KB Output is correct
15 Correct 3247 ms 40328 KB Output is correct
16 Correct 2942 ms 42792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 12120 KB Output is correct
2 Correct 13 ms 12124 KB Output is correct
3 Correct 13 ms 12200 KB Output is correct
4 Correct 13 ms 12124 KB Output is correct
5 Correct 13 ms 12200 KB Output is correct
6 Correct 12 ms 12200 KB Output is correct
7 Correct 16 ms 12120 KB Output is correct
8 Correct 14 ms 12124 KB Output is correct
9 Correct 13 ms 12124 KB Output is correct
10 Correct 12 ms 12124 KB Output is correct
11 Correct 13 ms 12120 KB Output is correct
12 Correct 14 ms 12124 KB Output is correct
13 Correct 13 ms 12128 KB Output is correct
14 Correct 13 ms 12132 KB Output is correct
15 Correct 13 ms 12120 KB Output is correct
16 Correct 13 ms 12124 KB Output is correct
17 Correct 12 ms 12192 KB Output is correct
18 Correct 15 ms 12120 KB Output is correct
19 Correct 17 ms 12152 KB Output is correct
20 Correct 16 ms 12124 KB Output is correct
21 Correct 15 ms 12124 KB Output is correct
22 Correct 14 ms 12196 KB Output is correct
23 Correct 14 ms 12132 KB Output is correct
24 Correct 18 ms 12120 KB Output is correct
25 Correct 15 ms 12120 KB Output is correct
26 Correct 45 ms 12380 KB Output is correct
27 Correct 33 ms 12388 KB Output is correct
28 Correct 31 ms 12376 KB Output is correct
29 Correct 17 ms 12124 KB Output is correct
30 Correct 42 ms 12204 KB Output is correct
31 Correct 40 ms 12376 KB Output is correct
32 Correct 25 ms 12292 KB Output is correct
33 Correct 23 ms 12124 KB Output is correct
34 Correct 35 ms 12632 KB Output is correct
35 Correct 33 ms 12412 KB Output is correct
36 Correct 43 ms 12540 KB Output is correct
37 Correct 31 ms 12380 KB Output is correct
38 Correct 33 ms 12376 KB Output is correct
39 Correct 33 ms 12440 KB Output is correct
40 Correct 37 ms 12380 KB Output is correct
41 Correct 3273 ms 45192 KB Output is correct
42 Correct 3047 ms 42420 KB Output is correct
43 Correct 2854 ms 37564 KB Output is correct
44 Correct 2833 ms 47316 KB Output is correct
45 Correct 2926 ms 43652 KB Output is correct
46 Correct 105 ms 13268 KB Output is correct
47 Correct 2557 ms 48052 KB Output is correct
48 Correct 2885 ms 38076 KB Output is correct
49 Correct 2894 ms 47284 KB Output is correct
50 Correct 2962 ms 47284 KB Output is correct
51 Correct 2848 ms 47284 KB Output is correct
52 Correct 3171 ms 45108 KB Output is correct
53 Correct 3009 ms 43700 KB Output is correct
54 Correct 3305 ms 46216 KB Output is correct
55 Correct 3247 ms 40328 KB Output is correct
56 Correct 2942 ms 42792 KB Output is correct
57 Correct 3956 ms 47000 KB Output is correct
58 Correct 3975 ms 43092 KB Output is correct
59 Correct 2747 ms 36796 KB Output is correct
60 Correct 3473 ms 47176 KB Output is correct
61 Correct 3364 ms 43392 KB Output is correct
62 Correct 2817 ms 40324 KB Output is correct
63 Correct 109 ms 13116 KB Output is correct
64 Correct 2970 ms 46604 KB Output is correct
65 Correct 3053 ms 39608 KB Output is correct
66 Correct 2805 ms 41904 KB Output is correct
67 Correct 2397 ms 41908 KB Output is correct
68 Correct 2481 ms 35768 KB Output is correct
69 Correct 2217 ms 27956 KB Output is correct
70 Correct 2757 ms 35604 KB Output is correct
71 Correct 2871 ms 32548 KB Output is correct
72 Correct 2938 ms 33712 KB Output is correct
73 Correct 2796 ms 35512 KB Output is correct
74 Correct 3148 ms 34480 KB Output is correct
75 Correct 2265 ms 27068 KB Output is correct
76 Correct 3196 ms 34372 KB Output is correct
77 Correct 2912 ms 35712 KB Output is correct