제출 #1028582

#제출 시각아이디문제언어결과실행 시간메모리
1028582UmairAhmadMirzaPalembang Bridges (APIO15_bridge)C++17
31 / 100
2089 ms2572 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int const inf=1e16;
int k,n;
void solve(){
	vector<int> pos;
	int ans=0;
	vector<pair<int,int>> pr;
	for (int i = 0; i < n; ++i)
	{
		char a,b;
		int pa,pb;
		cin>>a>>pa>>b>>pb;
		if(a==b)
			ans+=abs(pa-pb);
		else{
			if(pa>pb)
				swap(pa,pb);
			pr.push_back({pa,pb});
			pos.push_back(pa);
			pos.push_back(pb);
		}
	}
	ans+=pr.size();
	int ans1=inf;
	if(pr.size()==0)
		ans1=0;
	for (auto b1:pos)
		for(auto b2:pos){
			if(b1>=b2)
				continue;
			int temp=0;
			for(auto p:pr)
				temp+=min( abs(b1-p.first)+abs(b1-p.second) , abs(b2-p.first)+abs(b2-p.second));
			ans1=min(ans1,temp);
		}
	cout<<ans+ans1<<endl;
}
signed main(){
	cin>>k>>n;
	if(k==2){
		solve();
		return 0;
	}
	vector<int> pos;
	int ans=0;
	int sm=0;
	for (int i = 0; i < n; ++i)
	{
		char a,b;
		int pa,pb;
		cin>>a>>pa>>b>>pb;
		if(a==b)
			ans+=abs(pa-pb);
		else{
			sm+=pa;
			sm+=pb;
			pos.push_back(pa);
			pos.push_back(pb);
		}
	}
	sort(pos.begin(), pos.end());
	int ex=0;
	int cnta=0;
	ans+=(pos.size())/2;
	int cntb=pos.size();
	int ans1=sm;
	for (auto i:pos)
	{
		// cout<<i<<' ';
		sm-=i;
		ex+=i;
		cnta++;
		cntb--;
		int temp=(i*cnta)-ex;
		temp+=sm-(i*cntb);
		// cout<<temp<<endl;
		ans1=min(ans1,temp);
	}
	cout<<ans+ans1<<endl;
	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...