제출 #1339721

#제출 시각아이디문제언어결과실행 시간메모리
1339721javkhlantogsPalembang Bridges (APIO15_bridge)C++20
22 / 100
326 ms38168 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(void){
	ios::sync_with_stdio(0); cin.tie(0);
	ll k,n,i,j;
	cin>>k>>n;
	vector<ll> s(n),t(n);
	vector<char> p(n),q(n);
	ll ans=0,val=1e18,cnt=0;
	for(i=0 ; i<n ; i++){
		cin>>p[i]>>s[i]>>q[i]>>t[i];
		if(p[i]==q[i]){
			cnt++;
			ans+=abs(s[i]-t[i]);
			continue;
		}
	}
	if(cnt==n){
		cout<<ans<<"\n";
		return 0;
	}
	if(k==1){
		vector<vector<ll>> pos;
		map<ll,ll> mp,mp1;
		for(i=0 ; i<n ; i++){
			if(p[i]==q[i]) continue;
			pos.push_back({s[i],i,0});
			pos.push_back({t[i],i,1});
			mp[s[i]]++;
			mp[t[i]]++;
		}
		ll x=0,y,last=0;
		for(auto v:mp){
			y=v.second;
			if(x!=0) mp1[v.first]=x;
			if(x!=0) mp[v.first]=v.first-last;
			x+=y;
			last=v.first;
		}
		sort(pos.begin(),pos.end());
		ll valtmp=0,brpos;
		if(pos.size()) brpos=pos[0][0];
		for(auto v:pos){
			if(v[2]==0) valtmp+=abs(brpos-v[0])+abs(brpos-t[v[1]])+1;
		}
		val=min(val,valtmp);
		for(auto v:mp1){
			valtmp+=v.second*mp[v.first];
			valtmp-=(pos.size()-v.second)*mp[v.first];
			val=min(val,valtmp);
		}
		ans+=val;
		cout<<ans<<"\n";
	}
		else{
			ll sz=0;
			map<ll,ll> mp1,mp2,mp;
			for(i=0 ; i<n ; i++){
				if(p[i]==q[i]) continue;
				mp1[s[i]]++;
				mp1[t[i]]++;
				sz+=2;
			}
			cnt=0;
			for(auto v:mp1) mp[cnt++]=v.first;
			vector<ll> pre,suff;
			ll x=0,y=0;
			for(auto v:mp1){
				pre.push_back(x);
				suff.push_back(sz-x);
				x+=v.second;
			}
			ll p1=0,p2,val=1e18;
			for(i=1 ; i<pre.size()-1 ; i++){
				ll valtmp=0;
				for(j=0 ; j<n ; j++){
					if(p[j]==q[j]) continue;
					valtmp+=min(abs(mp[0]-t[j])+abs(mp[0]-s[j]),abs(mp[i]-t[j])+abs(mp[i]-s[j]))+1;
				}
				if(valtmp<val){
					p2=i;
					val=valtmp;
				}
			}
			sz=pre.size();
			while(p1<sz-2){
				p1++;
				while(p2<sz-1){
					p2++;
					ll valtmp=0;
					for(j=0 ; j<n ; j++){
						if(p[j]==q[j]) continue;
						valtmp+=min(abs(mp[p1]-t[j])+abs(mp[p2]-s[j]),abs(mp[p1]-t[j])+abs(mp[p1]-s[j]))+1;
					}
					if(val<valtmp){
						p2--;
						break;
					}
					val=min(val,valtmp);
				}
			}
			ans+=val;
			cout<<ans<<"\n";
		}
	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...