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 <cstdio>
#include <algorithm>
#include <functional>
using namespace std;
const greater<int> gr;
struct Median {
int sz;
int mn[100007];
int mx[100007];
void clear() { sz = 0; }
long long insert(int a, int b, long long d) { // a <= b
if (!sz) return sz++, d + (*mx = b) - (*mn = a);
if (b < *mn) {
d += *mn * 2 - a - b;
mx[sz] = *mn;
pop_heap(mn, mn + sz);
mn[sz - 1] = a; mn[sz] = b;
push_heap(mn, mn + sz);
} else if (a > *mx) {
d += a + b - *mx * 2;
mn[sz] = *mx;
pop_heap(mx, mx + sz, gr);
mx[sz - 1] = a; mx[sz] = b;
push_heap(mx, mx + sz, gr);
} else {
d += b - a;
mn[sz] = a; mx[sz] = b;
}
push_heap(mn, mn + ++sz);
push_heap(mx, mx + sz, gr);
return d;
}
} med;
struct Point {
int a, b;
bool operator<(const Point& pt) const { return a + b < pt.a + pt.b; }
} pt[100003];
int g[200003];
long long ansl[100003];
int main() {
int K, N;
scanf("%d%d", &K, &N);
char ca[3], cb[3];
if (K == 1) {
int a, b, tN = 0;
long long ans = 0;
for (int i = 0; i < N; i++) {
scanf("%s%d%s%d", ca, &a, cb, &b);
if (*ca == *cb) ans += abs(b - a);
else g[tN++] = a, g[tN++] = b, ans++;
}
nth_element(g, g + (tN / 2), g + tN);
for (int i = 0; i < tN / 2; i++) ans += g[tN / 2] - g[i];
for (int i = tN / 2; i < tN; i++) ans += g[i] - g[tN / 2];
printf("%lld", ans);
return 0;
}
int tN = 0;
long long pre = 0;
for (int i = 0; i < N; i++) {
auto& z = pt[tN];
scanf("%s%d%s%d", ca, &z.a, cb, &z.b);
if (z.a > z.b) swap(z.a, z.b);
if (*ca == *cb) pre += z.b - z.a;
else pre++, tN++;
}
if (tN) {
sort(pt, pt + tN);
med.clear();
for (int i = 0; i < tN; i++) ansl[i + 1] = med.insert(pt[i].a, pt[i].b, ansl[i]);
long long ans = ansl[tN], now = 0;
med.clear();
for (int i = tN - 1; i >= 0; i--) {
now = med.insert(pt[i].a, pt[i].b, now);
if (now + ansl[i] < ans) ans = now + ansl[i];
}
printf("%lld", ans + pre);
} else printf("%lld", pre);
}
Compilation message (stderr)
bridge.cpp: In function 'int main()':
bridge.cpp:48:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &K, &N);
~~~~~^~~~~~~~~~~~~~~~
bridge.cpp:54:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s%d%s%d", ca, &a, cb, &b);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s%d%s%d", ca, &z.a, cb, &z.b);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |