#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fast_io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fr(i,a,b) for (int i=a; i<b; i++)
#define loop(x,n) for (int x=0; x<n; x++)
#define mod 1000000007
#define inf (1LL<<60)
#define all(x) (x).begin(), (x).end()
typedef long double lld;
typedef unsigned long long ull;
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif
void _print(long long t) {cerr << t;}
void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(lld t) {cerr << t;}
void _print(double t) {cerr << t;}
void _print(ull t) {cerr << t;}
template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.first); cerr << ","; _print(p.second); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
bool cmp (pair<int,int> a, pair<int,int> b) {
return a.first + a.second < b.first + b.second;
}
class SlidingMedian {
priority_queue<int> left_max; // <= median
priority_queue<int, vector<int>, greater<int>> right_min; // >= median
long long sum_left = 0, sum_right = 0;
void balance() {
if (left_max.size() > right_min.size() + 1) {
int val = left_max.top(); left_max.pop();
sum_left -= val;
right_min.push(val);
sum_right += val;
} else if (right_min.size() > left_max.size()) {
int val = right_min.top(); right_min.pop();
sum_right -= val;
left_max.push(val);
sum_left += val;
}
}
public:
void add(int num) {
if (left_max.empty() || num <= left_max.top()) {
left_max.push(num);
sum_left += num;
} else {
right_min.push(num);
sum_right += num;
}
balance();
}
// Use LOWER median always (assumes left.size() >= right.size())
int median() const {
return left_max.top();
}
long long cost() const {
long long m = median();
// sum |a - m| = m*L - sum_left + sum_right - m*R
return m * 1LL * left_max.size() - sum_left
+ sum_right - m * 1LL * right_min.size();
}
};
void solve() {
int k, n;
cin >> k >> n;
long long ans = 0;
vector<pair<int,int>> a;
a.reserve(n);
for (int i = 0; i < n; i++) {
char ch1, ch2;
int p, s;
cin >> ch1 >> p >> ch2 >> s;
if (ch1 == ch2) {
ans += llabs(1LL * s - p);
} else {
a.pb({p, s});
}
}
if (a.empty()) { // nothing to pair/split
cout << ans << '\n';
return;
}
sort(all(a), cmp);
SlidingMedian s1, s2;
int m = (int)a.size();
vector<long long> pre(m), suf(m);
for (int i = 0; i < m; i++) {
s1.add(a[i].first);
s1.add(a[i].second);
pre[i] = s1.cost();
}
debug(pre);
for (int i = m - 1; i >= 0; i--) {
s2.add(a[i].first);
s2.add(a[i].second);
suf[i] = s2.cost();
}
debug(suf);
long long res = LLONG_MAX;
for (int i = 0; i < m ; i++) {
res = min(res, pre[i] + suf[i ]);
}
cout << (res + ans) << '\n';
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
freopen("Error.txt", "w", stderr);
#endif
fast_io;
cout.setf(std::ios::fixed); cout<<setprecision(10);
int t = 1;
// cin >> t;
while (t--) solve();
}
Compilation message (stderr)
bridge.cpp: In function 'int main()':
bridge.cpp:141:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
141 | freopen("input.txt","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:142:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
142 | freopen("output.txt","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:143:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
143 | freopen("Error.txt", "w", stderr);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |