Submission #1195121

#TimeUsernameProblemLanguageResultExecution timeMemory
1195121hackstarPalembang Bridges (APIO15_bridge)C++20
31 / 100
140 ms2632 KiB
#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-300);i<=min(n-1,n/2+300);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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...