제출 #1247208

#제출 시각아이디문제언어결과실행 시간메모리
1247208kunzaZa183Wiring (IOI17_wiring)C++20
100 / 100
40 ms8116 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

long long min_total_length(vector<int> r, vector<int> b) {
  vector<pair<int, int>> vpii;
  for (auto a : r)
    vpii.emplace_back(a, 0);
  for (auto a : b)
    vpii.emplace_back(a, 1);

  sort(vpii.begin(), vpii.end());

  vector<ll> qsum(vpii.size());
  qsum[0] = vpii[0].first;
  for (int i = 1; i < vpii.size(); i++)
    qsum[i] = qsum[i - 1] + vpii[i].first;

  auto qry = [&](int l, int r) {
    if (l == 0)
      return qsum[r];
    return qsum[r] - qsum[l - 1];
  };

  vector<ll> dp(vpii.size(), LLONG_MAX);
  auto matching = [&](int i1, int i2, int i3, int i4) {
    int n = (i2 - i1 + 1), m = (i4 - i3 + 1);

    ll bef;
    if (i1 == 0)
      bef = 0;
    else {
      bef = min(dp[i1 - 1], dp[i1]);
    }

    if (bef == LLONG_MAX)
      return LLONG_MAX;

    if (n < m) {
      ll k = m - n;
      return qry(i3, i4) - qry(i1, i2) - k * vpii[i2].first + bef;
    } else {
      ll k = n - m;
      return qry(i3, i4) - qry(i1, i2) + k * vpii[i3].first + bef;
    }
  };

  int in0 = 0, in1 = 0;
  for (int i = 0; i < vpii.size(); i++)
    if (vpii[i].second != vpii[0].second &&
        (i + 1 == vpii.size() || vpii[i].second != vpii[i + 1].second)) {
      in1 = i;
      break;
    }

  vector<array<int, 3>> vai3;
  vai3.push_back({vpii[0].second, 0, 0});
  for (int i = 1; i < vpii.size(); i++)
    if (vai3.back()[0] == vpii[i].second) {
      vai3.back()[2]++;
    } else {
      vai3.push_back({vpii[i].second, i, i});
    }

  // for (auto [a, b, c] : vai3) {
  //   cout << a << ' ' << b << ' ' << c << "\n";
  // }
  // cout << "\n";

  for (int i = 1; i < vai3.size(); i++) {
    int in0 = vai3[i - 1][2];
    for (int j = vai3[i][1]; j <= vai3[i][2]; j++) {
      while (in0 > vai3[i - 1][1] &&
             matching(in0 - 1, vai3[i - 1][2], vai3[i][1], j) <=
                 matching(in0, vai3[i - 1][2], vai3[i][1], j)) {
        in0--;
      }

      dp[j] = matching(in0, vai3[i - 1][2], vai3[i][1], j);
      // cout << in0 << " " << j << " " << dp[j] << "\n";
    }
  }

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