Submission #1315730

#TimeUsernameProblemLanguageResultExecution timeMemory
1315730AksLolCodingWiring (IOI17_wiring)C++17
100 / 100
47 ms8312 KiB
#include"wiring.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
const long long INF=1e18;
long long dp[MAXN],pref[MAXN];
bool comp(pair<long long,long long> a,pair<long long,long long> b)
{
	return a.second<b.second;
}
long long min_total_length(vector<int> A,vector<int> B)
{
	vector< pair<long long,long long> > vi;
	for(auto v:A) vi.push_back({0,v});
	for(auto v:B) vi.push_back({1,v});
	sort(vi.begin(),vi.end(),comp);
	int n=vi.size();
	for(int i=1;i<=n;i++) pref[i]=pref[i-1]+vi[i-1].second,dp[i]=INF;
	int pre=1;
	for(int i=1;i<n;i++) if(vi[i-1].first!=vi[i].first)
	{
		int pos=i+1;
		while(pos<=n&&vi[pos-1].first==vi[i].first) pos++;
		pos--;
		int p=pre,cnt=0;
		long long va=INF;
		for(int j=pos;j>i;j--)
		{
			int res=i-(j-i)+1;
			while(p<=res) va=min(va,min(dp[p-1],dp[p])+pref[p-1]-pref[i]*2+vi[i].second*(i-p+1)),p++;
			dp[j]=min(dp[j],va+pref[j]-vi[i].second*(j-i));
		}
		va=INF;
		for(int j=i+1;j<=pos;j++)
		{
			int pp=i-(j-i-1);
			va-=vi[i-1].second;
			if(pp>=pre) va=min(va,min(dp[pp],dp[pp-1])+pref[pp-1]-pref[i]*2);
			dp[j]=min(dp[j],va+pref[j]);
		}
		pre=i+1;
	}
	return dp[n];
}
#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...