This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#define sze(x) (ll) x.size()
#define idx(x, a) get<x>(a)
#define LID(x) (x << 1LL)
#define RID(x) (x << 1LL) + 1LL
#define ID(x) (x + MAXN)
#define CONV(x) (x - MAXN)
#define countbit(x) __builtin_popcountll(x)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pi;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll rand(ll l, ll r)
{
return uniform_int_distribution<ll>(l, r)(rng);
}
inline ll lcm(ll u, ll v)
{
return u * v / __gcd(u, v);
}
const ll MAXN = 2e5 + 3;
const ll INF = 1e18;
pi a[MAXN];
ll b[MAXN];
ll k, n, m, res = 0;
ll solve(ll u, ll v)
{
ll rt = 0;
for (ll i = 1; i <= n; ++i)
{
ll mn = min(abs(a[i].fi - u) + abs(a[i].se - u) + 1, abs(a[i].fi - v) + abs(a[i].se - v) + 1);
rt += mn;
}
return rt;
}
ll comp(ll x, ll y)
{
return (x > y ? 1 : (x < y ? -1 : 0));
}
void solve1()
{
ll x = b[m / 2];
for (ll i = 1; i <= n; ++i)
{
ll rt = abs(a[i].fi - x) + abs(a[i].se - x) + 1;
res += rt;
}
cout << res;
}
void solve2()
{
ll rt = INF;
ll l = 1, r = 2, curans = INF;
vector<ll> cl(m + 2);
vector<ll> cr(m + 2);
while (r <= m)
{
ll tans = solve(b[l], b[r]);
if (tans <= curans)
{
curans = tans;
++r;
}
else
{
cl[l] = r - 1;
++l;
if (l < r - 1) curans = solve(b[l], b[r - 1]);
else curans = INF;
}
}
for (ll i = 1; i < m; ++i) if (cl[i] == 0) cl[i] = m;
for (ll i = 1; i < m; ++i) rt = min(rt, solve(b[i], b[cl[i]]));
// ll check = INF;
// for (ll l = 1; l <= m; ++l)
// {
// ll pre = INF, idx = 0;
// for (ll r = l + 1; r <= m; ++r)
// {
// ll tans = solve(b[l], b[r]);
//// if (pre < tans) break;
// if (tans <= pre)
// {
// pre = tans;
// idx = r;
// }
// }
// cr[l] = idx;
// check = min(check, pre);
// }
// for (ll i = 1; i <= m; ++i) cerr << cl[i] << " "; cerr << endl;
// for (ll i = 1; i <= m; ++i) cerr << cr[i] << " "; cerr << endl;
// cerr << rt << " " << check << endl;
// assert(rt == check);
if (rt != INF) res += rt;
cout << res;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
#ifdef OFFLINE
freopen("input.inp", "r", stdin);
#endif
ll _;
cin >> k >> _;
n = 0, m = 0;
ll mn = INF, mx = -INF;
set<ll> s;
for (ll i = 1; i <= _; ++i)
{
char c1, c2; ll p1, p2; cin >> c1 >> p1 >> c2 >> p2;
// c1 = 'A', c2 = 'B';
// p1 = rand(1, _), p2 = rand(1, _);
// cerr << c1 << " " << p1 << " " << c2 << " " << p2 << endl;
if (c1 == c2) res += abs(p1 - p2);
else
{
s.insert(p1); s.insert(p2);
a[++n] = {p1, p2};
}
}
for (auto& v : s) b[++m] = v;
b[m + 1] = 1e12;
if (k == 1) solve1();
else solve2();
}
Compilation message (stderr)
bridge.cpp: In function 'int main()':
bridge.cpp:130:8: warning: unused variable 'mn' [-Wunused-variable]
130 | ll mn = INF, mx = -INF;
| ^~
bridge.cpp:130:18: warning: unused variable 'mx' [-Wunused-variable]
130 | ll mn = INF, mx = -INF;
| ^~
# | 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... |