Submission #1206209

#TimeUsernameProblemLanguageResultExecution timeMemory
1206209mychecksedadGrowing Vegetables is Fun 5 (JOI24_vegetables5)C++20
30 / 100
5085 ms38072 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 2e6+10, K = 52, MX = 30;

int n;
int a[N], b[N], c[N], T[M], T3[M], ls[N], rs[N], TT[M], TT3[M];
array<int, 2> to[N];
bool B[N], C[N];

// array<int, 2> gett(int val, int k){
//   return array<int,2>{(lower_bound(b+1, b+1+n, val - k) - b), (upper_bound(b+1, b+1+n, val + k) - b - 1)};
// }
int sz;
void build(){
  sz = 1;
  while(sz <= n) sz *= 2;
  --sz;

  for(int k = sz + 1; k <= sz + n; ++k){
    T[k] = ls[k - sz] - 1;
    T3[k] = rs[k - sz] - 1;
    TT[k] = (T[k] >= 0 ? 0 : -1);
    TT3[k] = (T3[k] >= 0 ? 0 : -1);
  }
  for(int k = sz + n + 1; k <= sz + sz + 1; ++k){
    T[k] = T3[k] = TT[k] = TT3[k] = 0;
  }

  for(int k = sz; k >= 1; --k){
    T[k] = T[k<<1] + T[k<<1|1];
    T3[k] = T3[k<<1] + T3[k<<1|1];
    TT[k] = TT[k<<1] + min(TT[k<<1|1] + (T[k<<1] - TT[k<<1]), 0);
    TT3[k] = TT3[k<<1|1] + min(TT3[k<<1] + (T3[k<<1|1] - TT3[k<<1|1]), 0);
  }
}

void upd(int k, int val){
  k += sz;
  T[k] += val;
  TT[k] = (T[k] >= 0 ? 0 : -1);

  for(k >>= 1; k > 0; k >>= 1){
    T[k] = T[k<<1] + T[k<<1|1];
    TT[k] = TT[k<<1] + min(TT[k<<1|1] + (T[k<<1] - TT[k<<1]), 0);
  }
}
void upd2(int l, int val, int r, int val2){
  r += sz;
  l += sz;
  T[l] += val;
  TT[l] = (T[l] >= 0 ? 0 : -1);
  T[r] += val2;
  TT[r] = (T[r] >= 0 ? 0 : -1);

  for(l >>= 1, r >>= 1; l > 0; l >>= 1, r >>= 1){
    if(l != r){
      T[l] = T[l<<1] + T[l<<1|1];
      TT[l] = TT[l<<1] + min(TT[l<<1|1] + (T[l<<1] - TT[l<<1]), 0);

      T[r] = T[r<<1] + T[r<<1|1];
      TT[r] = TT[r<<1] + min(TT[r<<1|1] + (T[r<<1] - TT[r<<1]), 0);
    }else{
      T[l] = T[l<<1] + T[l<<1|1];
      TT[l] = TT[l<<1] + min(TT[l<<1|1] + (T[l<<1] - TT[l<<1]), 0);
    }
  }
}
void upd3(int k, int val){
  k += sz;
  T3[k] += val;
  TT3[k] = (T3[k] >= 0 ? 0 : -1);

  for(k >>= 1; k > 0; k >>= 1){
    T3[k] = T3[k<<1] + T3[k<<1|1];
    TT3[k] = TT3[k<<1|1] + min(TT3[k<<1] + (T3[k<<1|1] - TT3[k<<1|1]), 0);
  }
}
void upd32(int l, int val, int r, int val2){
  l += sz;
  r += sz;
  T3[l] += val;
  TT3[l] = (T3[l] >= 0 ? 0 : -1);

  T3[r] += val2;
  TT3[r] = (T3[r] >= 0 ? 0 : -1);

  for(l >>= 1, r >>= 1; l > 0; l >>= 1, r >>= 1){
    if(l != r){
      T3[l] = T3[l<<1] + T3[l<<1|1];
      TT3[l] = TT3[l<<1|1] + min(TT3[l<<1] + (T3[l<<1|1] - TT3[l<<1|1]), 0);
      
      T3[r] = T3[r<<1] + T3[r<<1|1];
      TT3[r] = TT3[r<<1|1] + min(TT3[r<<1] + (T3[r<<1|1] - TT3[r<<1|1]), 0);
    }else{
      T3[l] = T3[l<<1] + T3[l<<1|1];
      TT3[l] = TT3[l<<1|1] + min(TT3[l<<1] + (T3[l<<1|1] - TT3[l<<1|1]), 0);
    }
  }
}

void dfs(int l, int r, int k){
  // cerr << l << ' ' << r << ' ' << T3[k] << ' ' << OK3[k] << ' ' << TT3[k] << '\n';
  // int mid = l+r>>1;
  // if(l == r) return;
  // dfs(l, mid, k<<1);
  // dfs(mid+1, r, k<<1|1);
  for(int k = 1; k <= sz+n; ++k){
  }
}

bool f(int k){
  for(int i = 1; i <= 2*n; ++i) B[i] = C[i] = 0;

  for(int rep = 0; rep < 2; ++rep){

    int L = 1, R = n;
    for(int i = 1; i <= n*3; ++i){
      ls[i] = rs[i] = 0;
      if(i > 2*n) to[i] = to[i - n*2];
      else{
        while(L <= n && b[L] < a[i] - k) ++L;
        while(L > 1 && b[L - 1] >= a[i] - k) --L;
        while(R < n && b[R + 1] <= a[i] + k) ++R;
        while(R >= 1 && b[R] > a[i] + k) --R;
        to[i] = {L, R};        
      }
      // cerr << k << ' ' << i << ' ' << to[i][0] << ' ' << to[i][1] << '\n';
    }
    int cnt_bad = 0;
    for(int i = 1; i <= n; ++i){
      ls[to[i][0]]++;
      rs[to[i][1]]++;
      if(to[i][0] > to[i][1]) cnt_bad++;
    }
    build();

    for(int i = n + 1; i <= 3 * n; ++i){
      if(TT[1] >= 0 && TT3[1] >= 0 && cnt_bad == 0){ // i-n ... i-1 is nice
        B[i - n] = 1;
      }

      // if(k == 1e9 && i == n + 1 && rep == 0){
      //   dfs(1, n, 1);
      // }

      if(to[i - n][0] > to[i - n][1]) cnt_bad--;
      if(to[i][0] > to[i][1]) cnt_bad++;


      // if(to[i - n][0] <= to[i][0]) upd(1, n, to[i - n][0], to[i][0] - 1, 1, -1);
      // else upd(1, n, to[i][0], to[i - n][0] - 1, 1, 1);
      if(to[i - n][0] <= n && to[i][0] <= n){
        if(to[i][0] < to[i - n][0]) upd2(to[i][0], 1, to[i - n][0], -1);
        else if(to[i][0] >= to[i - n][0]) upd2(to[i - n][0], -1, to[i][0], 1);
      }else{
        if(to[i - n][0] <= n) upd(to[i - n][0], -1);
        if(to[i][0] <= n) upd(to[i][0], 1);
      }
      
      if(to[i - n][1] > 0 && to[i][1] > 0){
        if(to[i][1] < to[i - n][1]) upd32(to[i][1], 1, to[i - n][1], -1);
        else if(to[i][1] > to[i - n][1]) upd32(to[i - n][1], -1, to[i][1], 1);
      }else{
        if(to[i - n][1] > 0) upd3(to[i - n][1], -1);
        if(to[i][1] > 0) upd3(to[i][1], 1);
      }

      // if(to[i - n][1] <= to[i][1]) upd3(1, n, to[i - n][1] + 1, to[i][1], 1, 1);
      // else upd3(1, n, to[i][1] + 1, to[i - n][1], 1, -1);
    }

    for(int i = 1; i <= n; ++i){
      swap(b[i], c[i]);
    }
    for(int i = 1; i <= 2*n; ++i) swap(B[i], C[i]); 
  }
// en;
// for(int i = 1; i <= n*2; ++i){
//   cerr << B[i];
// }
// en;
// for(int i = 1; i <= n*2; ++i){
//   cerr << C[i];
// }
// en;
  for(int i = 1; i <= n; ++i){
    if(B[i] && C[i + n]) return 1;
    if(C[i] && B[i + n]) return 1;
  }
  return 0;
}

void solve(){
  cin >> n;
  for(int i = 1; i <= n*2; ++i){
    cin >> a[i];
  }
  for(int i = n+n+1; i <= n+n+n; ++i) a[i] = a[i-n-n];
  for(int i = 1; i <= n; ++i){
    cin >> b[i];
  }
  for(int i = 1; i <= n; ++i){
    cin >> c[i];
  }
  sort(b+1, b+1+n);
  sort(c+1, c+1+n);
  int L = 0, R = 1e9, ans = 1e9;
  while(L <= R){
    int mid = L+R>>1;
    if(f(mid)){
      ans = mid;
      R = mid-1;
    }else L = mid+1;
  }
  cout << ans;
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
    en;
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  return 0;
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...