제출 #470206

#제출 시각아이디문제언어결과실행 시간메모리
470206flashmtAliens (IOI16_aliens)C++17
100 / 100
229 ms6516 KiB
#include <bits/stdc++.h>
using namespace std;
const long long oo = 1LL << 60;

struct Line
{
  long long a, b;
  int id;

  long long calc(long long x)
  {
    return a * x + b;
  }
};

struct Hull
{
  deque<Line> q;

  int isBad(Line x, Line y, Line z)
  {
    return (x.b - z.b) * (z.a - y.a) >= (y.b - z.b) * (z.a - x.a);
  }

  void add(long long a, long long b, int id)
  {
    Line l = {a, b, id};
    while (size(q) >= 2 && isBad(q[size(q) - 2], q.back(), l))
      q.pop_back();
    q.push_back(l);
  }

  pair<long long, int> query(long long x)
  {
    while (size(q) >= 2 && q[0].calc(x) > q[1].calc(x))
      q.pop_front();
    return {q[0].calc(x), q[0].id};
  }
};

long long sqr(long long x)
{
  return x * x;
}

pair<long long, int> solve(vector<pair<int, int>> &a, long long penalty)
{
  int n = size(a) - 1;
  Hull hull;
  vector<pair<long long, int>> f(n + 1, pair<int, int>(oo, 0)); // (cost, number of photos)
  f[0] = {0, 0};
  for (int i = 1; i <= n; i++)
  {
    long long curB = f[i - 1].first + sqr(a[i].first) - sqr(max(0, a[i - 1].second - a[i].first));
    hull.add(-2 * a[i].first, curB, i - 1);
    auto [cost, id] = hull.query(a[i].second);
    f[i] = {cost + sqr(a[i].second) + penalty, f[id].second + 1};
  }
  return f[n];
}

long long take_photos(int n, int m, int k, vector<int> r, vector<int> c)
{
  vector<pair<int, int>> a = {{-1, -1}};
  for (int i = 0; i < n; i++)
    a.push_back({min(r[i], c[i]), max(r[i], c[i]) + 1});
  sort(begin(a), end(a));

  int cur = 0;
  for (int i = 1; i <= n; i++)
    if (a[i].first == a[cur].first) a[cur].second = a[i].second;
    else if (a[i].second > a[cur].second) a[++cur] = a[i];
  n = cur;
  a.resize(n + 1);

  long long low = 0, high = 1e12, res = high;
  while (low <= high)
  {
    long long mid = (low + high) / 2;
    if (solve(a, mid).second > k) low = mid + 1;
    else
    {
      res = mid;
      high = mid - 1;
    }
  }

  auto [f, photo] = solve(a, res);
  return f - k * res;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...