이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=305;
const ll INF=1e18;
int n;
ll r,c;
ll x[N],y[N];
ll calc(ll xl,ll xr){
    vector<ll> xs;
    for(int i=0;i<n;i++){
        xs.emplace_back(max(1LL,x[i]-xl));
        xs.emplace_back(min(r,x[i]+xr)+1);
    }
    xs.emplace_back(r+1);
    sort(xs.begin(),xs.end());
    xs.erase(unique(xs.begin(),xs.end()),xs.end());
    int xn=xs.size();
    vector<vector<pair<ll,int>>> event(xn);
    for(int i=0;i<n;i++){
        int xi=lower_bound(xs.begin(),xs.end(),max(1LL,x[i]-xl))-xs.begin();
        int xj=lower_bound(xs.begin(),xs.end(),min(r,x[i]+xr)+1)-xs.begin();
        event[xi].emplace_back(y[i],1);
        event[xj].emplace_back(y[i],0);
    }
    event.pop_back();
    ll mxa=0,mxb=0,sum=0;
    multiset<ll> pts,dif;
    for(auto &e:event){
        for(auto [x,t]:e){
            if(t){
                auto it=pts.emplace(x);
                if(next(it)!=pts.end()&&it!=pts.begin()){
                    dif.erase(dif.find(*next(it)-*prev(it)));
                }
                if(next(it)!=pts.end()){
                    dif.emplace(*next(it)-*it);
                }
                if(it!=pts.begin()){
                    dif.emplace(*it-*prev(it));
                }
            }else{
                auto it=pts.find(x);
                assert(it!=pts.end());
                if(next(it)!=pts.end()){
                    dif.erase(dif.find(*next(it)-*it));
                }
                if(it!=pts.begin()){
                    dif.erase(dif.find(*it-*prev(it)));
                }
                if(next(it)!=pts.end()&&it!=pts.begin()){
                    dif.emplace(*next(it)-*prev(it));
                }
                pts.erase(it);
            }
        }
        if(pts.empty())return INF;
        mxa=max(mxa,*pts.begin()-1);
        mxb=max(mxb,c-*pts.rbegin());
        if(!dif.empty()){
            sum=max(sum,*dif.rbegin()-1);
        }
    }
    return xl+xr+max(sum,mxa+mxb);
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> r >> c >> n;
    for(int i=0;i<n;i++){
        cin >> x[i] >> y[i];
    }
    vector<ll> xs;
    for(int i=0;i<n;i++){
        xs.emplace_back(x[i]-1);
        xs.emplace_back(r-x[i]);
        for(int j=0;j<i;j++){
            ll dx=abs(x[i]-x[j]);
            xs.emplace_back(dx);
            if(dx>0)xs.emplace_back(dx-1);
        }
    }
    xs.emplace_back(0);
    sort(xs.begin(),xs.end());
    xs.erase(unique(xs.begin(),xs.end()),xs.end());
    ll ans=INF;
    for(int xl:xs){
        for(int xr:xs){
            ans=min(ans,calc(xl,xr));
        }
    }
    cout << ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |