#include <bits/stdc++.h>
using namespace std;
long long solve(long long x, vector<vector<long long>> &Tab, long long K, vector<vector<long long>> &Tab2)
{
long long tot = 0;
vector<long long> dist(Tab.size()), close;
for (long long i = 0; i < Tab.size(); i++)
{
if (x < Tab[i][0])
{
close.push_back(Tab[i][1] + Tab[i][0] - x);
dist[Tab[i][2]] = (Tab[i][0] - x) * 2;
}
if (x > Tab2[i][0])
dist[Tab2[i][2]] = (x - Tab2[i][0]) * 2;
}
sort(close.begin(), close.end());
for (long long i = 0; i < Tab.size(); i++)
tot += dist[i];
if (K == 1)
return tot;
long long minn = tot, buff = 0, buff2 = 0, buff3 = 0, open = 0, last = 0, cur = 0;
while (buff < Tab.size() && Tab[buff][0] <= x)
buff++;
for (; buff < Tab.size(); buff++)
{
cur = Tab[buff][0];
last = x;
if (buff > 0)
last = max(last, Tab[buff - 1][0]);
while (buff2 < Tab.size() && Tab2[buff2][0] <= cur)
{
if (Tab2[buff2][1] <= x)
{
buff2++;
continue;
}
open++;
tot -= Tab2[buff2][0] - last;
buff2++;
}
while (buff3 < close.size() && close[buff3] <= cur)
{
tot += close[buff3] - last;
open--;
buff3++;
}
tot -= (cur - last) * (Tab.size() - buff) * 2;
tot += open * (cur - last);
minn = min(minn, tot);
}
return minn;
}
int main()
{
srand(time(0));
long long K, N;
cin >> K >> N;
long long tot = 0;
vector<vector<long long>> Tab, Tab2;
vector<int> points;
int buff = 0;
for (long long i = 0; i < N; i++)
{
long long b, d;
char a, c;
cin >> a >> b >> c >> d;
// a = 'A', c = 'B';
// b = rand() % 100, d = rand() % 100;
tot += abs(b - d);
if (a == c)
{
continue;
}
Tab.push_back({min(b, d), max(b, d), buff});
Tab2.push_back({max(b, d), min(b, d), buff});
points.push_back(a);
points.push_back(b);
buff++;
tot++;
}
sort(Tab.begin(), Tab.end());
sort(Tab2.begin(), Tab2.end());
sort(points.begin(), points.end());
vector<int> temp = {points[0]};
for (int i = 1; i < points.size(); i++)
if (points[i] != points[i - 1])
temp.push_back(points[i]);
swap(temp, points);
// for (int i = 0; i < points.size(); i++)
// cout << points[i] << " : " << solve(points[i], Tab, K, Tab2) << '\n';
long long L = 0, R = points.size() - 1;
while (L + 2 < R)
{
long long delta = (R - L) / 3;
long long m1 = L + delta, m2 = R - delta;
if (solve(points[m1], Tab, K, Tab2) < solve(points[m2], Tab, K, Tab2))
R = m2;
else
L = m1;
}
long long minn = 123456789123456789;
for (long long i = L; i <= R; i++)
minn = min(minn, solve(points[i], Tab, K, Tab2));
cout << tot + minn;
}
# | 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... |