Submission #1339601

#TimeUsernameProblemLanguageResultExecution timeMemory
1339601settopWiring (IOI17_wiring)C++20
0 / 100
1099 ms51380 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){
		fall(mask,0,63){
			dp[i][mask]=inf;
			if(mask&1) dp[i][mask]=dp[i+1][mask>>1];
			int nova=mask>>1;
			fall(nm,1,63){
				ll cst=0;
				bool tem=0;
				fall(j,i+1,min(n+m-1,i+6)){
					int bit=j-i-1;
					if(!(nm&(1<<bit)) || (nova&(1<<bit))) continue;
					if(v[j].S==v[i].S){
						cst=inf;
						break;
					}
					tem=1;
					cst+=v[j].F-v[i].F;
				}
				if(tem || mask&1) dp[i][mask]=min(dp[i][mask],dp[i+1][nm]+cst);
			}
		}
	}
	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...