This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
#define med q1.top()
struct Median{
priority_queue<ll, vector<ll>, less<ll>> q1;
priority_queue<ll, vector<ll>, greater<ll>> q2;
ll sum1, sum2;
Median() : sum1(0), sum2(0) {};
void insert(ll x) {
if (!q1.empty() && x >= med) q2.push(x), sum2 += x;
else q1.push(x), sum1 += x;
if (q1.size() > q2.size()+1) {
q2.push(q1.top());
sum2 += q1.top();
sum1 -= q1.top();
q1.pop();
} else if (q1.size() < q2.size()) {
q1.push(q2.top());
sum1 += q2.top();
sum2 -= q2.top();
q2.pop();
}
}
ll get() {
return med * ll(q1.size()) - sum1 +
sum2 - med * q2.size();
}
};
int main()
{
int M, N;
scanf("%d %d", &M, &N);
char a,c;
ll b,d, ans0 = 0;
vector<pll> v;
for (int i = 0; i < N; i++) {
scanf(" %c %lld %c %lld",&a, &b,&c, &d);
if (d < b) swap(b,d);
if (a == c) ans0 += d - b, N--, i--;
else v.push_back(pll(b,d)), ans0++;
}
if (v.empty()) {
printf("%lld\n", ans0);
return 0;
}
if (M == 1) {
vector<ll> all;
for (pll p : v)
all.push_back(p.first), all.push_back(p.second);
sort(all.begin(), all.end());
ll x = all[all.size()/2 - 1];
for (ll y : all)
ans0 += abs(y - x);
printf("%lld\n", ans0);
return 0;
} else {
sort(v.begin(), v.end(), [](pll a, pll b){return a.first+a.second<b.first+b.second;});
vector<ll> ans(N, ans0);
Median *mm = new Median();
for (int i = 0; i < N; i++) {
mm->insert(v[i].first);
mm->insert(v[i].second);
ans[i] += mm->get();
}
mm = new Median();
for (int i = N-1; i > 0; i--) {
mm->insert(v[i].first);
mm->insert(v[i].second);
ans[i-1] += mm->get();
}
ll ans0 = ans[0];
for (int i = 1; i < N; i++) ans0 = min(ans0, ans[i]);
printf("%lld\n", ans0);
}
}
Compilation message (stderr)
bridge.cpp: In function 'int main()':
bridge.cpp:41:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &M, &N);
^
bridge.cpp:47:42: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %c %lld %c %lld",&a, &b,&c, &d);
^
# | 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... |