제출 #447638

#제출 시각아이디문제언어결과실행 시간메모리
447638Haruto810198Cultivation (JOI17_cultivation)C++17
5 / 100
2079 ms464 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

#define FOR(i,l,r,d) for(int i=(l);i<=(r);i+=(d))
#define szof(x) ((int)(x).size())

#define vi vector<int>
#define pii pair<int,int>

#define F first
#define S second

#define pb push_back
#define eb emplace_back
#define mkp make_pair

const int INF = 2147483647;
const int LNF = 1e18;
const int MOD = 1000000007;
const int mod = 998244353;
const double eps = 1e-12;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

const int MAX = 310;

int n;
int R, C;
pii pt[MAX];

int res;

int check(int dxl, int dxr){

    //cerr<<"check("<<dxl<<", "<<dxr<<") : "<<endl;

    multiset<int> st;
    vector<vi> ev;
    /// insert : time,  1, pos
    /// erase  : time, -1, pos

    vector<vi> seg; /// minL, minR, minSum, L, R

    FOR(i, 1, n, 1){
        ev.pb({pt[i].F - dxl, 1, pt[i].S});
        ev.pb({pt[i].F + dxr + 1, -1, pt[i].S});
    }

    sort(ev.begin(), ev.end());

    int pv_time = -LNF;
    int minL = LNF, minR = LNF, minSum = LNF;

    for(auto E : ev){

        int Time = E[0];
        int type = E[1];
        int pos = E[2];

        if(pv_time < Time){
            seg.pb({minL, minR, minSum, pv_time, Time - 1});
        }

        pv_time = Time;

        if(type == 1){
            st.insert(pos);
        }
        else{
            auto it = st.find(pos);
            st.erase(it);
        }

        if(st.empty()){
            minSum = LNF;
        }
        else{

            minSum = 0;
            for(auto it=st.begin(); it!=st.end(); it++){

                if(it == st.begin()){
                    minL = *it - 1;
                }

                if(next(it) == st.end()){
                    minR = C - *it;
                }
                else{
                    auto nit = next(it);
                    minSum = max(minSum, *nit - *it - 1);
                }

            }

        }

    }

    int retL = 0, retR = 0, retSum = 0;

    //cerr<<"seg : "<<endl;

    bool AC = 0;

    for(auto I : seg){

        if(I[3] > R or I[4] < 1){
            continue;
        }
        /*
        cerr<<"{";
        for(auto i : I){
            cerr<<i<<", ";
        }
        cerr<<"}"<<endl;
        */
        retL = max(retL, I[0]);
        retR = max(retR, I[1]);
        retSum = max(retSum, I[2]);

        if(I[4] >= R){
            AC = 1;
        }

    }

    retSum = max(retSum, retL + retR);

    if(AC == 0){
        retSum = LNF;
    }

    //cerr<<dxl + dxr + retSum<<endl;

    return dxl + dxr + retSum;

}

signed main(){

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>R>>C;
    cin>>n;
    FOR(i, 1, n, 1){
        cin>>pt[i].F>>pt[i].S;
    }

    res = LNF;

    FOR(dxl, 0, R, 1){
        FOR(dxr, 0, R, 1){
            res = min(res, check(dxl, dxr));
        }
    }

    cout<<res<<'\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...