제출 #107160

#제출 시각아이디문제언어결과실행 시간메모리
107160oolimryPalembang Bridges (APIO15_bridge)C++14
100 / 100
115 ms8860 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<long long, long long> ii; bool comp(ii a, ii b){ return a.first + a.second < b.first + b.second; } int main() { //freopen("i.txt","r",stdin); int k, n; ios_base::sync_with_stdio(false); cin.tie(0); cin >> k >> n; vector<ii> pairs; long long forcedDist = 0ll; for(int i = 0;i < n;i++){ char a, c; long long b, d; cin >> a >> b >> c >> d; if(a == c){ forcedDist += abs(d-b); } else{ forcedDist += abs(d-b); forcedDist++; if(b > d) swap(b,d); pairs.push_back(ii(b,d)); } } n = pairs.size(); if(n == 0){ cout << forcedDist; return 0; } sort(pairs.begin(),pairs.end(),comp); for(int i = 0;i < n;i++){ //cout << pairs[i].first << " " << pairs[i].second << "\n"; } long long prefix[n]; long long suffix[n]; priority_queue<long long> low; priority_queue<long long, vector<long long>, greater<long long> > high; long long minVal = 0; for(int i = 0;i < n;i++){ long long p = pairs[i].first; long long q = pairs[i].second; if(low.empty()){ low.push(p); high.push(q); } else{ if(low.top() >= q){ low.push(p); low.push(q); minVal += abs(low.top() - q); high.push(low.top()); low.pop(); } else if(high.top() <= p){ high.push(p); high.push(q); minVal += abs(high.top() - p); low.push(high.top()); high.pop(); } else{ low.push(p); high.push(q); } } prefix[i] = minVal; } if(k == 1){ cout << prefix[n-1] * 2ll + forcedDist; return 0; } reverse(pairs.begin(),pairs.end()); while(!low.empty())low.pop(); while(!high.empty())high.pop(); minVal = 0; for(int i = 0;i < n;i++){ long long p = pairs[i].first; long long q = pairs[i].second; if(low.empty()){ low.push(p); high.push(q); } else{ if(low.top() >= q){ low.push(p); low.push(q); minVal += abs(low.top() - q); high.push(low.top()); low.pop(); } else if(high.top() <= p){ high.push(p); high.push(q); minVal += abs(high.top() - p); low.push(high.top()); high.pop(); } else{ low.push(p); high.push(q); } } suffix[i] = minVal; } reverse(suffix,suffix+n); //cout << "\n"; long long mv = suffix[0]; for(int i = 1;i < n;i++){ //cout << suffix[i] << " "; mv = min(prefix[i-1] + suffix[i], mv); } cout << mv * 2ll + forcedDist; 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...