Submission #1179127

#TimeUsernameProblemLanguageResultExecution timeMemory
1179127alexander707070Palembang Bridges (APIO15_bridge)C++20
0 / 100
0 ms324 KiB
#include<bits/stdc++.h>
#define MAXN 100007
using namespace std;

const long long inf=1e17;

struct house{
	int x,y;
};

int n,k,x,y,m,p,q;
long long ans;

char s,t;
house h[MAXN];
vector<int> vals;

void solve_easy(){

	int pos=vals[m];
	for(int i=1;i<=m;i++){
		ans+=abs(pos-h[i].x);
		ans+=abs(pos-h[i].y);
		ans++;
	}

	cout<<ans<<"\n";
}

long long calc(int id){
	q=vals[id];

	long long sum=0;
	for(int i=1;i<=m;i++){
		sum+=min( abs(h[i].x-p)+abs(h[i].y-p) , abs(h[i].x-q)+abs(h[i].y-q) )+1;
	}

	return sum;
}

long long bin(int s){
	int l=s,r=vals.size()-1,tt;

	while(l+1<r){
		tt=(l+r)/2;

		if(calc(tt)>calc(tt+1)){
			l=tt+1;
		}else{
			r=tt;
		}
	}

	long long res=calc(l);
	for(int i=max(s,l-2);i<=min(2*m-1,l+2);i++){
		res=min(res,calc(i));
	}

	return res;
}

void solve_hard(){
	vals.erase( unique( vals.begin(), vals.end() ), vals.end() );
	sort(vals.begin(),vals.end());

	long long best=inf;
	for(int i=0;i<vals.size();i++){
		p=vals[i];
		
		long long res=bin(i);
		best=min(best,res);
	}

	ans+=best;
	cout<<ans<<"\n";
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>k>>n;
	for(int i=1;i<=n;i++){
		cin>>s>>x>>t>>y;
		
		if(s==t){
			ans+=abs(x-y);
			continue;
		}

		m++; h[m]={x,y};
	}

	for(int i=1;i<=m;i++){
		vals.push_back(h[i].x);
		vals.push_back(h[i].y);
	}

	sort(vals.begin(),vals.end());

	if(k==1){
		solve_easy();
	}else{
		solve_hard();
	}

	return 0;
}
#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...