제출 #544542

#제출 시각아이디문제언어결과실행 시간메모리
544542benson1029Sightseeing in Kyoto (JOI22_kyoto)C++14
100 / 100
548 ms18968 KiB
#include<bits/stdc++.h> using namespace std; int h,w; long long a[2][100005]; long long l[2][100005], r[2][100005]; set< pair<double, pair<int,int> > > st; double calc(int id, int y) { int x = l[id][y]; return ((double)(a[id][y]-a[id][x])) / (y-x); } int main() { ios::sync_with_stdio(false); cin >> h >> w; l[0][h+1] = h; for(int i=1; i<=h; i++) { cin >> a[0][i]; l[0][i] = i-1; r[0][i] = i+1; } l[1][w+1] = w; for(int i=1; i<=w; i++) { cin >> a[1][i]; l[1][i] = i-1; r[1][i] = i+1; } for(int i=2; i<=h; i++) { st.insert({calc(0, i), {0, i} }); } for(int i=2; i<=w; i++) { st.insert({{calc(1, i), {1, i} }}); } long long ans = 0; for(int i=0; i<h+w-2; i++) { int id = (*prev(st.end())).second.first; int y = (*prev(st.end())).second.second; if(id==0) { if(r[0][y] > h) { ans += (a[1][l[1][w+1]] * (y - l[0][y])); } else { st.erase({calc(0, r[0][y]), {0, r[0][y]} }); } } else { if(r[1][y] > w) { ans += (a[0][l[0][h+1]] * (y - l[1][y])); } else { st.erase({calc(1, r[1][y]), {1, r[1][y]} }); } } st.erase(prev(st.end())); l[id][r[id][y]] = l[id][y]; r[id][l[id][y]] = r[id][y]; if(r[id][y] <= (id==0?h:w) && l[id][y] > 0) { st.insert({calc(id, r[id][y]), {id, r[id][y]} }); } } cout << ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...