#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(),x.end()
struct node{
char home1,off1;
int home2,off2;
};
void solve(){
int k,n;
cin>>k>>n;
vector<node>a(n);
int mx_=0;
for(int i=0;i<n;i++){
cin>>a[i].home1>>a[i].home2>>a[i].off1>>a[i].off2;
mx_=max(mx_,a[i].home2);
mx_=max(mx_,a[i].off2);
}
auto dist=[&](node x,int bridge)->int{
if(x.home1==x.off1){
return abs(x.home2-x.off2);
}
return 1+abs(x.home2-bridge)+abs(x.off2-bridge);
};
auto calc=[&](int bridge)->int{
int ans=0;
for(int i=0;i<n;i++){
ans+=dist(a[i],bridge);
}
return ans;
};
auto get_mx=[&](int bridge)->int{
int ans=dist(a[0],bridge);
for(int i=1;i<n;i++){
ans=max(ans,dist(a[i],bridge));
}
return ans;
};
if(k==1){
int l=0,r=mx_;
while (l<r){
int mid=(l+r)>>1;
if (calc(mid)<=calc(mid+1)){
r=mid;
}
else{
l=mid+1;
}
}
cout<<calc(l)<<'\n';
return;
}
auto dist_k2=[&](node x,int bridge1,int bridge2)->int{
if(x.home1==x.off1){
return abs(x.home2-x.off2);
}
return 1+min(abs(x.home2-bridge1)+abs(x.off2-bridge1),abs(x.home2-bridge2)+abs(x.off2-bridge2));
};
auto calc_k2=[&](int bridge1,int bridge2)->int{
int ans=0;
for(int i=0;i<n;i++){
ans+=dist_k2(a[i],bridge1,bridge2);
}
return ans;
};
int ans=calc_k2(0,1);
map<int,int>vis;
for(int i=max(0ll,n/2-100);i<=min(n-1,n/2+100);i++){
node ff=a[i];
int l=ff.home2,r=mx_;
if(vis[ff.home2]==1);
else{
while (l<r){
int mid=(l+r)>>1;
if (calc_k2(mid,ff.home2)<=calc_k2(mid+1,ff.home2)){
r=mid;
}
else{
l=mid+1;
}
}
ans=min(ans,calc_k2(ff.home2,l));
vis[ff.home2]=1;
}
l=ff.off2,r=mx_;
if(vis[ff.off2]==1);
else{
while (l<r){
int mid=(l+r)>>1;
if (calc_k2(mid,ff.off2)<=calc_k2(mid+1,ff.off2)){
r=mid;
}
else{
l=mid+1;
}
}
ans=min(ans,calc_k2(ff.off2,l));
vis[ff.off2]=1;
}
}
cout<<ans<<'\n';
}
signed main(){
int t=1;
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
//cin>>t;
while(t--){
solve();
}
}
# | 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... |