이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
#define fi first
#define se second
typedef pair<int, int> ii;
int same, res, n, lsum, rsum, pre[N];
vector<ii> vec;
priority_queue<int> lq;
priority_queue<int, vector<int>, greater<int>> rq;
void add(int x){
//cout << x << "\n";
int tp = 1e18;
if (lq.size()) tp = lq.top();
if (x <= tp){
lq.push(x);
lsum += x;
}
else {
rq.push(x);
rsum += x;
}
if (rq.size() + 1 < lq.size()){
tp = lq.top();
lq.pop();
rq.push(tp);
rsum += tp;
lsum -= tp;
}
if (lq.size() < rq.size()){
tp = rq.top();
rq.pop();
lq.push(tp);
rsum -= tp;
lsum += tp;
}
}
bool cmp(ii& a, ii& b){
return a.fi + a.se < b.fi + b.se;
}
int k;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cin >> k >> n;
for (int i = 1; i <= n; i++){
char aa, bb;
int pos1, pos2;
cin >> aa >> pos1 >> bb >> pos2;
if (aa == bb){
same += abs(pos2 - pos1);
}
else{
vec.push_back({pos1, pos2});
}
}
sort(vec.begin(), vec.end(), cmp);
same += vec.size();
for (int i = 1; i <= (int) vec.size(); i++){
add(vec[i - 1].fi);
add(vec[i - 1].se);
//cout << rsum << " " << lsum << "\n";
pre[i] = rsum - lsum;
}
res = pre[vec.size()];
if (k == 2){
lsum = rsum = 0;
while (lq.size()) lq.pop();
while (rq.size()) rq.pop();
for (int i = (int) vec.size(); i >= 1; i--){
add(vec[i - 1].fi);
add(vec[i - 1].se);
res = min(res, pre[i - 1] + rsum - lsum);
}
}
cout << res + same;
return 0;
}
# | 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... |