제출 #1324191

#제출 시각아이디문제언어결과실행 시간메모리
1324191vtnooWiring (IOI17_wiring)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); i++)
#define R(i, j, k) for(int i = (j); i >= (k); i--)
#define sz(a) ((int) a.size())
#define pb emplace_back
#define me(a, x) memset(a, x, sizeof(a))
#define fst first
#define snd second
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll INF=1e18;
void chmin(ll &a,ll b){
	a=min(a,b);
}
long long min_total_length(std::vector<int> r, std::vector<int> b) {
	vector<vector<ll>>grupos;
	vector<pair<ll,bool>>cord;
	L(i,0,sz(r)-1){
		cord.pb(r[i],0);
	}
	L(i,0,sz(b)-1){
		cord.pb(b[i],1);
	}
	sort(cord.begin(),cord.end());
	grupos.pb(vector<ll>(0));
	L(i,0,sz(cord)-1){
		if(i&&cord[i].snd!=cord[i-1].snd){
			grupos.pb(vector<ll>(0));
		}
		grupos.back().pb(cord[i].fst);
	}
	vector<ll>dp(sz(grupos[0])+1,INF);
	dp[0]=0;
	//~ cout<<"PASS"<<endl;
	L(g,1,sz(grupos)-1){
		auto &blk=grupos[g];
		auto &prevBlk=grupos[g-1];
		vector<ll>ndp(sz(grupos[g])+1,INF);
		int n=sz(blk),m=sz(prevBlk);
		ll middle=blk.front()-prevBlk.back();
		
		//~ cout<<"PASS2"<<endl;
		
		//tengo para cada prefijo y sufijo cuanta es la distancia hacia el "borde"
		vector<ll>suff(m+1),pref(n+1);
		L(i,0,n-1){
			pref[i+1]+=pref[i]+blk[i]-blk.front();
		}
		R(i,m-1,0){
			suff[i]+=suff[i+1]+prevBlk.back()-prevBlk[i];
		}
		
		//~ cout<<"PASS1"<<endl;
		
		//ahora necesito tomar en cuenta los casos en los cuales mi sz(prev)>sz(act)
		//o viceversa
		vector<ll>izqMayor(m+1,INF),derMayor(m+1,INF);
		L(i,0,m){
			izqMayor[i]=dp[m-i]+suff[m-i];
			derMayor[i]=dp[m-i]+suff[m-i]+1ll*i*middle;
		}
		L(i,1,m)chmin(izqMayor[i],izqMayor[i-1]);
		R(i,m-1,0)chmin(derMayor[i],derMayor[i+1]);
		
		L(i,0,n){
			if(i>=m)chmin(ndp[i],i*middle+derMayor[m]+pref[i]);
			else chmin(ndp[i],i*middle+derMayor[i]+pref[i]);
			if(i<m){
				chmin(ndp[i],izqMayor[i+1]+pref[i]);
			}
		}
		
		swap(dp,ndp);
	}
	return dp.back();
}


#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...