이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 j = 0; j < 2*n; j++) {
int pos;
if (j < n) pos = intervals[j].first;
else pos = intervals[j-n].second;
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 (r < l) {
ll temp = l;
l = r;
r = temp;
}
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+best[n-1]) << "\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... |