#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define ALL(x) x.begin(),x.end()
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> intset;
char t1,t2;
int k,n,a,b;
ll lad,res,sumade,sumaiz;
bool cmp(pair<int,int> a,pair<int,int> b){return a.first+a.second<b.first+b.second;};
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> k >> n;
vector<pair<int,int>> nums;
vector<int> dif;
for(int i=0;i<n;i++){
cin >> t1 >> a >> t2 >> b;
if(t1==t2)lad+=abs(a-b);
else{
dif.push_back(a);
dif.push_back(b);
nums.push_back({min(a,b),max(a,b)});
}
}
sort(ALL(nums),cmp);
n=nums.size();
sort(ALL(dif));
for(int i=0;i<dif.size();i++){
res+=abs(dif[i]-dif[dif.size()/2]);
}
res+=n;
if(k==1){
cout << lad+res;
return 0;
}
sort(ALL(nums),cmp);
intset de;
vector<ll> sumaaaa(n);
for(int i=0;i<n;i++){
if(de.empty()){
de.insert(nums[i].first);
}else{
ll valmedante=*de.find_by_order(de.size()/2);
sumade+=abs(valmedante-nums[i].first);
de.insert(nums[i].first);
if(nums[i].first<valmedante){
//nada
ll valmednow=*de.find_by_order(de.size()/2);
sumade-=(valmedante-valmednow);
//sumade+=(valmedante-valmednow)*(de.size()-de.size()/2-1);
//sumade-=(valmedante-valmednow)*(de.size()/2+1);
}
}
ll valmedante=*de.find_by_order(de.size()/2);
sumade+=abs(valmedante-nums[i].second);
de.insert(nums[i].second);
/*if(nums[i].second>valmedante){
ll valmednow=*de.find_by_order(de.size()/2);
sumade-=(valmedante-valmednow)*(de.size()-de.size()/2);
sumade+=(valmedante-valmednow)*(de.size()/2);
}*/
sumaaaa[i]=sumade;
}
for(int i=0;i<n-1;i++){
//de 0 a i pref, de i+1 a n-1 suf
//quitar nums[i] del de
ll valmedante=*de.find_by_order(de.size()/2);
sumade-=abs(valmedante-nums[i].first);
de.erase(de.find(nums[i].first));
if(nums[i].first>=valmedante){
ll valmednow=*de.find_by_order(de.size()/2);
sumade-=valmedante-valmednow;
}
valmedante=*de.find_by_order(de.size()/2);
sumade-=abs(valmedante-nums[i].second);
de.erase(de.find(nums[i].second));
res=min(res,sumade+sumaaaa[i]+n);
}
cout << lad+res;
}
| # | 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... |