#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 200005;
template<class T, int SZ> struct BIT {
T bit[SZ+1];
BIT() { memset(bit,0,sizeof bit); }
void upd(int k, T val) { // add val to index k
for( ;k <= SZ; k += (k&-k)) bit[k] += val;
}
T query(int k) {
T temp = 0;
for (;k > 0;k -= (k&-k)) temp += bit[k];
return temp;
}
T query(int l, int r) { return query(r)-query(l-1); } // range query [l,r]
};
BIT<ll,MX> s[2];
int K,N;
ll ans = 0, mn = INF;
vpi v;
map<int,int> m;
vi rm;
pl cur;
pl operator+(const pl& l, const pl& r) { return {l.f+r.f,l.s+r.s}; }
pl operator-(const pl& l, const pl& r) { return {l.f-r.f,l.s-r.s}; }
ll eval(int x) {
return s[1].query(x)*rm[x]+s[0].query(x);
}
ll ternary() {
int lo = 1, hi = sz(m);
while (lo+2<hi) {
int l1 = (2*lo+hi)/3, r1 = (lo+2*hi)/3;
if (eval(l1) < eval(r1)) hi = r1;
else lo = l1;
}
ll z = INF;
FOR(i,lo,hi+1) z = min(z,eval(i));
return z;
}
void ad(int ind, int l, int r, int x) {
s[ind].upd(l,x);
s[ind].upd(r+1,-x);
}
void ins(int a, int b) {
ad(1,1,m[a],-1);
ad(0,1,m[a],a);
ad(1,m[b],sz(m),1);
ad(0,m[b],sz(m),-b);
}
ll pre(int x) {
return cur.s*rm[x]-cur.f;
}
void getmn() {
vpi ev;
for (auto x: v) {
ev.pb({x.f,x.s});
ev.pb({x.s,-1});
cur = cur+mp(x.s,1);
}
int co = 0;
rm.resize(sz(m)+1);
rm.pb(-1);
vi tri;
for (auto& a: m) {
a.s = ++co;
// cout << "HA " << a.f << " " << a.s << "\n";
rm[co] = a.f;
}
sort(all(ev)); reverse(all(ev));
int ind = 0;
FORd(i,1,sz(m)+1) {
while (ind < sz(ev) && ev[ind].f >= rm[i]) {
if (ev[ind].s != -1) {
ins(ev[ind].f,ev[ind].s);
} else {
cur = cur-mp(ev[ind].f,1);
}
ind ++;
}
// cout << "OH " << i << " " << rm[i] << " " << pre(i) << " " << eval(i) << "\n";
if (K == 2) mn = min(mn,pre(i)+ternary());
else mn = min(mn,pre(i)+eval(i));
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> K >> N;
m[0] = 0;
F0R(i,N) {
char a1, b1; int a2, b2;
cin >> a1 >> a2 >> b1 >> b2;
ans += abs(a2-b2);
if (a1 != b1) {
v.pb({min(a2,b2),max(a2,b2)});
ans ++;
m[a2] = m[b2] = 0;
}
}
getmn();
cout << ans+2*mn;
}
/* Look for:
* the exact constraints (multiple sets are too slow for n=10^6 :( )
* special cases (n=1?)
* overflow (ll vs int?)
* array bounds
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
3448 KB |
Output is correct |
2 |
Correct |
5 ms |
3484 KB |
Output is correct |
3 |
Correct |
8 ms |
3644 KB |
Output is correct |
4 |
Correct |
10 ms |
3824 KB |
Output is correct |
5 |
Correct |
8 ms |
3824 KB |
Output is correct |
6 |
Correct |
7 ms |
3824 KB |
Output is correct |
7 |
Correct |
7 ms |
3824 KB |
Output is correct |
8 |
Correct |
7 ms |
3824 KB |
Output is correct |
9 |
Correct |
9 ms |
3824 KB |
Output is correct |
10 |
Correct |
6 ms |
3824 KB |
Output is correct |
11 |
Correct |
7 ms |
3824 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
3824 KB |
Output is correct |
2 |
Correct |
6 ms |
3824 KB |
Output is correct |
3 |
Correct |
7 ms |
3824 KB |
Output is correct |
4 |
Correct |
9 ms |
3824 KB |
Output is correct |
5 |
Correct |
7 ms |
3824 KB |
Output is correct |
6 |
Correct |
7 ms |
3824 KB |
Output is correct |
7 |
Correct |
7 ms |
3824 KB |
Output is correct |
8 |
Correct |
8 ms |
3824 KB |
Output is correct |
9 |
Correct |
8 ms |
3824 KB |
Output is correct |
10 |
Correct |
7 ms |
3824 KB |
Output is correct |
11 |
Correct |
8 ms |
3824 KB |
Output is correct |
12 |
Correct |
94 ms |
6728 KB |
Output is correct |
13 |
Correct |
637 ms |
17088 KB |
Output is correct |
14 |
Correct |
188 ms |
17088 KB |
Output is correct |
15 |
Correct |
343 ms |
17088 KB |
Output is correct |
16 |
Correct |
94 ms |
17088 KB |
Output is correct |
17 |
Correct |
257 ms |
17088 KB |
Output is correct |
18 |
Correct |
319 ms |
17088 KB |
Output is correct |
19 |
Correct |
414 ms |
17088 KB |
Output is correct |
20 |
Correct |
139 ms |
17088 KB |
Output is correct |
21 |
Correct |
249 ms |
17088 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
17088 KB |
Output is correct |
2 |
Correct |
5 ms |
17088 KB |
Output is correct |
3 |
Incorrect |
5 ms |
17088 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
17088 KB |
Output is correct |
2 |
Correct |
5 ms |
17088 KB |
Output is correct |
3 |
Incorrect |
6 ms |
17088 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
17088 KB |
Output is correct |
2 |
Correct |
5 ms |
17088 KB |
Output is correct |
3 |
Incorrect |
6 ms |
17088 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |