Submission #624215

#TimeUsernameProblemLanguageResultExecution timeMemory
624215bruceccccccAliens (IOI16_aliens)C++14
60 / 100
2084 ms40756 KiB
#include "aliens.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define intersectX(a, b) (b.c - a.c) / (double) (a.m - b.m)

struct Photo {
  int x, s;
};

struct Line {
  ll m, c;
  ll eval(ll x) {
    return m * x + c;
  }
};
// double intersectX(Line& a, Line& b) {
//   return (b.c - a.c) / (double) (a.m - b.m);
// }

ll take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
  vector<int> size(m, 0);

  for (int i = 0; i < n; i++) {
    if (r[i] <= c[i]) size[r[i]] = max(size[r[i]], c[i] - r[i] + 1);
    else size[c[i]] = max(size[c[i]], r[i] - c[i] + 1);
  }
  vector<Photo> photos;
  vector<ll> add(1), st(1);

  int prev = 0;
  for (int i = 0; i < m; i++) {
    if (size[i] > prev) {
      prev = size[i];
      if (photos.empty() || i >= photos.back().x + photos.back().s) {
        st.push_back(0);
        add.push_back(add.back() + 1ll * size[i] * size[i]);
      } else {
        ll start = photos.back().x + photos.back().s - i;
        add.push_back(add.back() + 1ll * size[i] * size[i] - start * start);
        st.push_back(start * start);
      }
      photos.push_back({ i, size[i] });
    }
    prev = max(0, prev - 1);
  }

  ll ans = add[photos.size()];

  vector<deque<Line>> hulls(k+1);
  for (int i = 0; i < photos.size(); i++) {
    for (int j = k; j >= 1; j--) {
      auto& d = hulls[j-1];
      ll a = 0;
      ll endPoint = photos[i].x + photos[i].s;
      if (j > 1 && d.size() > 0) {
        while (d.size() >= 2 && d[0].eval(endPoint) > d[1].eval(endPoint))
          d.pop_front();
        
        Line& val = d[0];
        a = val.m * endPoint + val.c + 1ll * endPoint * endPoint - add[i+1];
      } else if (j == 1) {
        ll w = endPoint - photos.front().x;
        a = w * w - add[i+1];
      }

      if (i == photos.size() - 1 && j == k) {
        ans += a;
        break;
      }

      auto& q = hulls[j];
      Line next = { -2 * photos[i+1].x, 1ll * photos[i+1].x * photos[i+1].x - st[i+2] + add[i+1] + a };
      int s = q.size() - 1;
      while (s >= 1 && intersectX(next, q[s-1]) < intersectX(q[s-1], q[s])) {
        q.pop_back();
        s--;
      }
      q.push_back(next);
    }
  }

  return ans;
}

Compilation message (stderr)

aliens.cpp: In function 'll take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:52:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Photo>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |   for (int i = 0; i < photos.size(); i++) {
      |                   ~~^~~~~~~~~~~~~~~
aliens.cpp:68:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Photo>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |       if (i == photos.size() - 1 && j == k) {
      |           ~~^~~~~~~~~~~~~~~~~~~~
#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...