Submission #624123

#TimeUsernameProblemLanguageResultExecution timeMemory
624123bruceccccccAliens (IOI16_aliens)C++14
0 / 100
1 ms212 KiB
#include "aliens.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct Photo {
  int x, s;
};

struct Line {
  ll m, c;
  double intersectX(Line b) {
    return (b.c - c) / (double) (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<vector<Line>> dp(k+1);
  for (int i = 0; i < photos.size(); i++) {
    for (int j = 1; j <= k; j++) {
      auto& d = dp[j-1];
      ll a = 0;
      ll endPoint = photos[i].x + photos[i].s;
      if (d.size() > 0) {
        int l = 0, r = d.size() - 2;
        while (l < r) {
          int m = (l + r) / 2;
          if (endPoint < d[m].intersectX(d[m+1])) r = m;
          else l = m + 1;
        }
        auto val = d[l];
        a = val.m * endPoint + val.c + 1ll * endPoint * endPoint - add[i+1];
        // if (i == 2) cout << i << ' ' << j << ' ' << val.c << endl;
        // if (i == 2 && j == 2) cout << i << ' ' << j << ' ' << val.m << ' ' << val.c << endl;
      }
      
      if (i == photos.size() - 1 && j == k) ans += a;

      auto& q = dp[j];
      Line next = { -2 * photos[i].x, 1ll * photos[i].x * photos[i].x - st[i+1] + add[i] + a };
      while (q.size() >= 2 && next.intersectX(q[q.size()-2]) < q[q.size()-2].intersectX(q.back()))
        q.pop_back();
      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:70:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Photo>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |       if (i == photos.size() - 1 && j == k) ans += a;
      |           ~~^~~~~~~~~~~~~~~~~~~~
#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...