제출 #1338682

#제출 시각아이디문제언어결과실행 시간메모리
1338682Math4Life2020Sightseeing in Kyoto (JOI22_kyoto)C++20
100 / 100
46 ms26844 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>; using ld = long double; using ti = pair<ld,pii>;

const ll INF = 1e18;

ld d(ll a, ll b) {
    return (((ld)a)/b);
}

ti fz(ti a, ti b) {
    pii pc = {a.second.first+b.second.first,a.second.second+b.second.second};
    return {d(pc.first,pc.second),pc};
}

vector<ti> getv(vector<ll> v1) {
    vector<ti> vf;
    for (ll i=0;i<(v1.size()-1);i++) {
        vf.push_back({d(v1[i+1]-v1[i],1),{v1[i+1]-v1[i],1}});
        while (vf.size()>=2 && vf[vf.size()-2].first>vf[vf.size()-1].first) {
            ti a = vf.back(); vf.pop_back();
            ti b = vf.back(); vf.pop_back();
            vf.push_back(fz(a,b));
        }
    }
    return vf;
}

ll solve(vector<ll> v1, vector<ll> v2) {
    ll N = v1.size(); ll M = v2.size();
    if (N<=1 || M<=1) {
        return 0;
    }
    for (ll i=(N-2);i>=0;i--) {
        v1[i]=min(v1[i],v1[i+1]);
    }
    for (ll i=(M-2);i>=0;i--) {
        v2[i]=min(v2[i],v2[i+1]);
    }
    vector<ti> vt1 = getv(v1);
    vector<ti> vt2 = getv(v2);
    vector<pair<ld,pair<ll,pii>>> vs;
    for (ti A0: vt1) {
        vs.push_back({A0.first,{0,A0.second}});
    }
    for (ti A0: vt2) {
        vs.push_back({A0.first,{1,A0.second}});
    }
    sort(vs.begin(),vs.end());
    ll csum[2] = {0,0};
    ll ans = 0;
    for (auto A0: vs) {
        ll t0 = A0.second.first;
        pii p0 = A0.second.second;
        ll pv = p0.first;
        ll pn = p0.second;
        ans += pn*csum[1-t0];
        csum[t0]+=pv;
    }
    return ans;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
    ll H,W; cin >> H >> W;
    vector<ll> A,B;
    ll ans = 0;
    ll vamin = INF;
    ll xamin = -1;
    for (ll i=0;i<H;i++) {
        ll a1; cin >> a1;
        A.push_back(a1);
        if (a1<vamin) {
            vamin = a1;
            xamin = i;
        }
    }
    ll vbmin = INF;
    ll xbmin = -1;
    for (ll i=0;i<W;i++) {
        ll a1; cin >> a1;
        B.push_back(a1);
        if (a1<vbmin) {
            vbmin = a1;
            xbmin = i;
        }
    }
    vector<ll> v1t,v2t;
    for (ll i=xamin;i>=0;i--) {
        v1t.push_back(A[i]-vamin);
    }
    for (ll i=xbmin;i>=0;i--) {
        v2t.push_back(B[i]-vbmin);
    }
    vector<ll> v1b,v2b;
    for (ll i=xamin;i<H;i++) {
        v1b.push_back(A[i]-vamin);
    }
    for (ll i=xbmin;i<W;i++) {
        v2b.push_back(B[i]-vbmin);
    }
    ans += (vamin*(W-1)+vbmin*(H-1));
    ans += solve(v1t,v2t);
    ans += solve(v1b,v2b);
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...