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>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<ll, ll> pii;
typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
const ll MAXN = 1e5;
ll k, n, m;
pii intervals[MAXN];
ll ans = 0;
ll best[MAXN];
ll bestrev[MAXN];
ordered_set divs;
struct comp {
bool operator()(const pii &a, const pii &b) {
return (a.first+a.second) < (b.first+b.second);
}
} comp;
void rev() {
for (ll i = 0; i < n; i++) {
ll f = intervals[i].first;
intervals[i].first = 1e9-intervals[i].second;
intervals[i].second = 1e9-f;
}
for (ll i = 0; i < n/2; i++) {
pii temp = intervals[i];
intervals[i] = intervals[n-1-i];
intervals[n-1-i] = temp;
}
}
void makebests(ll best[]) {
divs.clear();
divs.insert(intervals[0].first);
divs.insert(intervals[0].second);
ll curbest = intervals[0].second-intervals[0].first;
best[0] = curbest;
for (ll i = 1; i < n; i++) {
//ll prevl = divs.find_by_order(divs.size()/2-1);
ll prevr = *(divs.find_by_order(divs.size()/2));
divs.insert(intervals[i].first);
divs.insert(intervals[i].second);
assert(divs.size() % 2 == 0);
// ll curl = divs.find_by_order(divs.size()/2-1);
// ll curr = divs.find_by_order(divs.size()/2);
best[i] = best[i-1]+intervals[i].second-intervals[i].first;
if (intervals[i].first > prevr) best[i] += 2*(intervals[i].first-prevr);
}
}
ll bash() {
ll b = -1;
for (int pos = 0; pos <= 100; pos++) {
ll cur = 0;
for (int i = 0; i < n; i++) {
cur += intervals[i].second-intervals[i].first;
if (pos > intervals[i].second) cur += 2*(pos-intervals[i].second);
if (pos < intervals[i].first) cur += 2*(intervals[i].first-pos);
}
if (b == -1 || cur < b) b = cur;
}
return b;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin >> k >> m;
n = 0;
for (ll i = 0; i < m; i++) {
char c1, c2; ll l, r;
cin >> c1 >> l >> c2 >> r;
if (c1 == c2) {
ans += r-l;
}
else {
ans++;
intervals[n++] = pii(l, r);
}
}
if (n == 0) {
cout << ans << "\n";
return 0;
}
sort(intervals, intervals+n, comp);
makebests(best);
if (k == 1) {
ll b = bash();
//assert(best[n-1] == b);
cout << (ans+b) << "\n";
return 0;
}
rev();
//sort(intervals, intervals+n, comp);
makebests(bestrev);
ll b = best[0]+bestrev[n-2];
for (ll i = 1; i < n-1; i++) {
if (best[i]+bestrev[n-2-i] < b) b = best[i]+bestrev[n-2-i];
}
cout << (b+ans) << "\n";
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... |