This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//S4
#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define ll long long
const int maxn = 2e5 + 5;
const ll inf = 1e16;
int n,m;
int pos[maxn];
ll sum[maxn];
ll dp[maxn];
ll get(int l1, int r1, int l2, int r2) {
ll res = (sum[r2]-sum[l2-1]) - (sum[r1]-sum[l1-1]);
res += (ll)max(0,(r2-l2+1)-(r1-l1+1))*(-(sum[r1]-sum[r1-1]));
res += (ll)max(0,(r1-l1+1)-(r2-l2+1))*(sum[l2]-sum[l2-1]);
// printf("----- get (%d, %d) (%d, %d) = %lld\n",l1,r1,l2,r2,res);
return res;
}
ll min_total_length(vi a, vi b) {
n = a.size(); m = b.size();
for(auto x : a) pos[x] = 0;
for(auto x : b) pos[x] = 1;
for(int i=1;i<=n+m;i++) sum[i] = sum[i-1] + i;
for(int x=n+m;x>=1;x--) {
dp[x] = inf;
int cnt = 0, i = -1;
for(int y=x+1;y<=n+m;y++) {
// printf("\tx = %d y = %d\n",x,y);
if(pos[y]!=pos[y-1]) {
if(i==-1) i = y;
else break;
}
if(i!=-1) dp[x] = min(dp[x], get(x,i-1,i,y) + dp[y+1]);
}
// printf("dp %d = %lld\n",x,dp[x]);
}
return dp[1];
}
Compilation message (stderr)
wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:27:13: warning: unused variable 'cnt' [-Wunused-variable]
int cnt = 0, i = -1;
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |