제출 #1339612

#제출 시각아이디문제언어결과실행 시간메모리
1339612settop전선 연결 (IOI17_wiring)C++20
10 / 100
191 ms160084 KiB
#include "wiring.h"
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define F first
#define S second
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=2e5+10;
const ll inf=1e16;
typedef pair<int,int> pii;
typedef tuple<int,int,int> trio;

ll dp[MAXN][100];

long long min_total_length(std::vector<int> r, std::vector<int> b){
	int n=sz(r),m=sz(b);

	vector<pii> v(n+m);
	fall(i,0,n-1) v[i]={r[i],0};
	fall(i,0,m-1) v[i+n]={b[i],1};

	sort(all(v));
	
	fall(mask,0,63) dp[n+m-1][mask]=inf;
	dp[n+m-1][1]=0;

	rfall(i,n+m-2,0){
		rfall(mask,63,0){
			dp[i][mask]=inf;
			if((mask&1)) dp[i][mask]=dp[i+1][mask>>1];
			fall(j,i+1,min(i+6,m+n-1)){
				if(v[i].S==v[j].S) continue;
				if(j==i+6) dp[i][mask]=min(dp[i][mask],dp[i+1][(mask>>1)+32]+v[j].F-v[i].F);
				else dp[i][mask]=min(dp[i][mask],dp[i][(mask|1)|(1<<(j-i))]+v[j].F-v[i].F);

			}
		}
	}
	return dp[0][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...