#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()
{
long long K, N;
cin >> K >> N;
long long tot = 0;
vector<vector<long long>> Tab, Tab2;
vector<long long> ponts;
long long buff = 0;
for (long long i = 0; i < N; i++)
{
long long b, d;
char a, c;
cin >> a >> b >> c >> d;
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});
ponts.push_back(b);
ponts.push_back(d);
buff++;
tot++;
}
sort(Tab.begin(), Tab.end());
sort(Tab2.begin(), Tab2.end());
sort(ponts.begin(), ponts.end());
vector<long long> temp;
if (ponts.size())
temp.push_back(ponts[0]);
for (long long i = 1; i < ponts.size(); i++)
if (ponts[i] != ponts[i - 1])
temp.push_back(ponts[i]);
swap(temp, ponts);
long long L = 0, R = ponts.size() - 1;
while (L + 2 < R)
{
long long delta = (R - L) / 3;
long long m1 = L + delta, m2 = R - delta;
if (solve(ponts[m1], Tab, K, Tab2) < solve(ponts[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(ponts[i], Tab, K, Tab2));
if (ponts.size() == 0)
minn = 0;
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... |