Submission #1208227

#TimeUsernameProblemLanguageResultExecution timeMemory
1208227mychecksedadCultivation (JOI17_cultivation)C++20
5 / 100
3 ms584 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 = 1e5+10, K = 52, MX = 30;


ll n, m, w;
array<ll, 2> a[N];
ll ans = 1e18;
ll f(ll u, ll d){
  vector<array<ll, 3>> A, B;
  vector<ll> X;
  for(int i = 1; i <= w; ++i){
    A.pb({a[i][0] - u, a[i][0] + d, a[i][1]});
    B.pb({a[i][0] + d, a[i][0] - u, a[i][1]});
    X.pb(a[i][0] - u);
    X.pb(a[i][0] + d + 1);

    // cerr << A.back()[0] << ' ' << A.back()[1] << ' '<< A.back()[2] << '\n';
  }
  X.pb(1);
  X.pb(n);
  sort(all(A));
  sort(all(B));
  sort(all(X));
  X.erase(unique(all(X)), X.end());
  int ptr = 0, ptr2 = 0;
  ll L = 0, R = 0, D = 0;

  multiset<ll> DD; // differences
  multiset<ll> Y; // active columns
  for(ll x_pos: X){
    if(x_pos < 1 || x_pos > n) continue;
    // cerr << l << ' ' << r << ' ' << col << '\n';
    while(ptr < B.size() && B[ptr][0] < x_pos){
      // auto it = Y.find(B[ptr][2]);
      // ll L = -1, R = -1;
      // if(it != Y.begin()){
      //   L = (*prev(it));
      //   DD.erase(DD.find((*it) - (*prev(it))));
      // }
      // if(next(it) != Y.end()){
      //   R = (*next(it));
      //   DD.erase(DD.find((*next(it)) - (*it)));
      // }
      // if(L != -1 && R != -1) DD.insert(R-L);
      Y.erase(Y.find(B[ptr][2]));
      ++ptr;
    }
    while(ptr2 < A.size() && A[ptr2][0] <= x_pos){
      // auto it = Y.upper_bound(A[ptr2][2]);
      // if(it != Y.end() && it != Y.begin()){
      //   DD.erase(DD.find((*it) - (*prev(it))));
      // }
      // if(it != Y.end()){
      //   DD.insert((*it) - A[ptr2][2]);
      // }
      // if(it != Y.begin()){
      //   DD.insert(A[ptr2][2] - (*prev(it)));
      // }

      Y.insert(A[ptr2][2]);
      ++ptr2;
    }
    
    if(Y.empty()){
      return 1e18;
    }        

    L = max(L, (*Y.begin()) - 1);
    R = max(R, m - (*prev(Y.end())));
    ll last_val = (*Y.begin());
    for(auto val: Y){
      D = max(D, val - last_val - 1);
      last_val = val;
    }
    // if(DD.size())
    //   D = max(D, (*prev(DD.end())) - 1);
  }
  // cerr << L << ' ' << R << ' ' << D << ' ' << d << ' ' << u << ' ' << L + R + max(0, D - L - R) + d + u << '\n';
  return L + R + max(0ll, D - L - R) + u;
}

void solve(){
  cin >> n >> m >> w;
  ll mn = n, mx = 1;
  for(int i = 1; i <= w; ++i){
    cin >> a[i][0] >> a[i][1];
    mn = min(mn, a[i][0]);
    mx = max(mx, a[i][0]);
  }

  vector<ll> U;
  for(int i = 1; i <= w; ++i){
    U.pb(a[i][0] - 1);
  }
  sort(all(U));
  U.erase(unique(all(U)), U.end());

  int C = U.size();

  vector<array<ll, 3>> WHAT;

  for(int j = 0; j < C; j ++){
    ll u = U[j];

    vector<array<ll, 2>> ST;
    for(int i = 1; i <= w; ++i){
      ST.pb({max(1ll, a[i][0] - u), a[i][0]});
    }
    vector<ll> D;

    for(int x = 0; x < ST.size(); ++x){
      auto [l, r] = ST[x];
      D.pb(n - r);
      for(int y = x + 1; y < ST.size(); ++y){
        auto [l2, r2] = ST[y];
        if(r < l2 || r2 < l){
          if(r < l2){
            D.pb(l2 - r - 1);
          }else{
            D.pb(l - r2 - 1);
          }
        }
      }
    }
    sort(all(D));
    D.erase(unique(all(D)), D.end());

    if(D.empty()) continue;

    for(auto d: D){
      WHAT.pb({u + d, u, d});
    }
  }
  sort(all(WHAT));
  int cnt = 0;
  for(int i = 0; i < WHAT.size(); ++i){
    if(i == 0 || WHAT[i][0] != WHAT[i - 1][0]){
      cnt++;
      ans = min(ans, f(WHAT[i][1], WHAT[i][2]) + WHAT[i][2]);
      // if(D.size() == 1){
      //   ans = min(ans, f(u, D[0]) + D[0]);
      //   continue;
      // }

      // // for(ll d: D){
      // //   cerr << d << ' ';
      // //   cerr << f(u, d) << '\n';
      // // }
      // // cerr << '\n';
      // // for(auto d: D) ans = min(ans, f(u, d) + d);
      // int last = 0;
      // ll best = 1e18;
      // ll last_val = f(u, D[0]);
      // best = min(best, last_val + D[0]);
      // for(; last + 1 < D.size(); ){
      //   int l = last + 1, r = int(D.size()) - 1, res = last + 1;
      //   ll changed_val = -1;
      //   while(l <= r){
      //     int mid = l+r>>1;
      //     ll cur = f(u, D[mid]);
      //     if(cur != last_val){
      //       r = mid - 1;
      //       res = mid;
      //       changed_val = cur;
      //     }else{     
      //       l = mid + 1;
      //     }
      //   }
      //   if(changed_val == -1) break;
      //   last_val = changed_val;
      //   best = min(best, last_val + D[res]);
      //   last = res;
      // }
      // ans = min(ans, best);
    }
  }

    

  // for(int i = 0; i < RES.size(); ++i){
  //   if(RES[i][0])
  // }

  cerr << cnt;
  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...
#Verdict Execution timeMemoryGrader output
Fetching results...