Submission #790120

#TimeUsernameProblemLanguageResultExecution timeMemory
790120WLZAliens (IOI16_aliens)C++17
25 / 100
1499 ms1048576 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; #ifdef DEBUG#include "../../../debug.h" #else #define debug(...) 0 #endif using ii = pair<int, int>;using ll = long long;using vi = vector<int>;using vll = vector<ll>;using vii = vector<ii>;const ll LINF = (ll) 1e18;/** * @brief Li Chao Tree with dynamically created nodes */class li_chao_tree { private: struct line { long long m, b; }; long long eval(const line &f, long long x) { return f.m * x + f.b; } struct node { node *left, *right; line f; long long l, r; node(long long _l, long long _r) : l(_l), r(_r) { left = right = nullptr; f = {0, LINF}; } } *root; void add(node *cur, line nf) { long long m = (cur->l + cur->r) / 2; bool bl = eval(nf, cur->l) < eval(cur->f, cur->l); bool bm = eval(nf, m) < eval(cur->f, m); if (bm) swap(cur->f, nf); if (cur->r - cur->l == 1) return; if (bl != bm) { if (cur->left == nullptr) cur->left = new node(cur->l, m); add(cur->left, nf); } else { if (cur->right == nullptr) cur->right = new node(m, cur->r); add(cur->right, nf); } } long long query(node *cur, long long x) { if (cur == nullptr) return LINF; if (cur->r - cur->l == 1) return eval(cur->f, x); long long m = (cur->l + cur->r) / 2; if (x < m) return min(eval(cur->f, x), query(cur->left, x)); else return min(eval(cur->f, x), query(cur->right, x)); } public: li_chao_tree(long long l, long long r) { root = new node(l, r); } void add(long long m, long long b) { add(root, {m, b}); } long long query(long long x) { return query(root, x); }};long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) { for (int i = 0; i < n; i++) if (r[i] > c[i]) swap(r[i], c[i]); vii segments; for (int i = 0; i < n; i++) segments.push_back({r[i], c[i]}); sort(segments.begin(), segments.end(), [&](const ii &a, const ii &b) { if (a.first == b.first) return a.second > b.second; return a.first < b.first; }); vi nr = {segments[0].first}, nc = {segments[0].second}; for (int i = 1; i < n; i++) { if (!(nr.back() <= segments[i].first && segments[i].second <= nc.back())) { nr.push_back(segments[i].first); nc.push_back(segments[i].second); } } swap(r, nr); swap(c, nc); n = (int) r.size(); debug(r, c); vector<vll> dp(n + 1, vll(k + 1, LINF)); dp[0].assign(k + 1, 0); vector<li_chao_tree> lct(k + 1, li_chao_tree(0, 0)); for (int j = 0; j <= k; j++) lct[j] = li_chao_tree(0, m); for (int j = 0; j < k; j++) lct[j].add(-2 * r[0], (ll) r[0] * r[0] - 2 * r[0]); for (int i = 1; i <= n; i++) { for (int j = 1; j <= k; j++) dp[i][j] = lct[j - 1].query(c[i - 1]) + (ll) (c[i - 1] + 1) * (ll) (c[i - 1] + 1); if (i < n) for (int j = 0; j <= k; j++) { lct[j].add(-2 * r[i], dp[i][j] + (ll) r[i] * r[i] - 2 * r[i] - max(0ll, (ll) c[i - 1] - r[i] + 1) * max(0ll, (ll) c[i - 1] - r[i] + 1)); } } debug(dp); return dp[n][k];}

Compilation message (stderr)

aliens.cpp:4:13: warning: extra tokens at end of #ifdef directive
    4 | #ifdef DEBUG#include "../../../debug.h"
      |             ^
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:6:20: warning: statement has no effect [-Wunused-value]
    6 | #define debug(...) 0
      |                    ^
aliens.cpp:8:2245: note: in expansion of macro 'debug'
    8 | using ii = pair<int, int>;using ll = long long;using vi = vector<int>;using vll = vector<ll>;using vii = vector<ii>;const ll LINF = (ll) 1e18;/** * @brief Li Chao Tree with dynamically created nodes */class li_chao_tree {  private:    struct line { long long m, b; };    long long eval(const line &f, long long x) { return f.m * x + f.b; }    struct node {      node *left, *right;      line f;      long long l, r;      node(long long _l, long long _r) : l(_l), r(_r) {        left = right = nullptr;        f = {0, LINF};      }    } *root;    void add(node *cur, line nf) {      long long m = (cur->l + cur->r) / 2;      bool bl = eval(nf, cur->l) < eval(cur->f, cur->l);      bool bm = eval(nf, m) < eval(cur->f, m);      if (bm) swap(cur->f, nf);      if (cur->r - cur->l == 1) return;      if (bl != bm) {        if (cur->left == nullptr) cur->left = new node(cur->l, m);        add(cur->left, nf);      } else {        if (cur->right == nullptr) cur->right = new node(m, cur->r);        add(cur->right, nf);      }    }    long long query(node *cur, long long x) {      if (cur == nullptr) return LINF;      if (cur->r - cur->l == 1) return eval(cur->f, x);      long long m = (cur->l + cur->r) / 2;      if (x < m) return min(eval(cur->f, x), query(cur->left, x));      else return min(eval(cur->f, x), query(cur->right, x));    }  public:    li_chao_tree(long long l, long long r) {      root = new node(l, r);    }        void add(long long m, long long b) {      add(root, {m, b});    }    long long query(long long x) {      return query(root, x);    }};long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) {  for (int i = 0; i < n; i++) if (r[i] > c[i]) swap(r[i], c[i]);  vii segments;  for (int i = 0; i < n; i++) segments.push_back({r[i], c[i]});  sort(segments.begin(), segments.end(), [&](const ii &a, const ii &b) {    if (a.first == b.first) return a.second > b.second;    return a.first < b.first;  });  vi nr = {segments[0].first}, nc = {segments[0].second};  for (int i = 1; i < n; i++) {    if (!(nr.back() <= segments[i].first && segments[i].second <= nc.back())) {      nr.push_back(segments[i].first);      nc.push_back(segments[i].second);    }  }  swap(r, nr); swap(c, nc); n = (int) r.size();  debug(r, c);  vector<vll> dp(n + 1, vll(k + 1, LINF)); dp[0].assign(k + 1, 0);  vector<li_chao_tree> lct(k + 1, li_chao_tree(0, 0));  for (int j = 0; j <= k; j++) lct[j] = li_chao_tree(0, m);  for (int j = 0; j < k; j++) lct[j].add(-2 * r[0], (ll) r[0] * r[0] - 2 * r[0]);  for (int i = 1; i <= n; i++) {    for (int j = 1; j <= k; j++) dp[i][j] = lct[j - 1].query(c[i - 1]) + (ll) (c[i - 1] + 1) * (ll) (c[i - 1] + 1);    if (i < n) for (int j = 0; j <= k; j++) {      lct[j].add(-2 * r[i], dp[i][j] + (ll) r[i] * r[i] - 2 * r[i] - max(0ll, (ll) c[i - 1] - r[i] + 1) * max(0ll, (ll) c[i - 1] - r[i] + 1));    }  }  debug(dp);  return dp[n][k];}
      |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ^~~~~
aliens.cpp:6:20: warning: statement has no effect [-Wunused-value]
    6 | #define debug(...) 0
      |                    ^
aliens.cpp:8:2861: note: in expansion of macro 'debug'
    8 | using ii = pair<int, int>;using ll = long long;using vi = vector<int>;using vll = vector<ll>;using vii = vector<ii>;const ll LINF = (ll) 1e18;/** * @brief Li Chao Tree with dynamically created nodes */class li_chao_tree {  private:    struct line { long long m, b; };    long long eval(const line &f, long long x) { return f.m * x + f.b; }    struct node {      node *left, *right;      line f;      long long l, r;      node(long long _l, long long _r) : l(_l), r(_r) {        left = right = nullptr;        f = {0, LINF};      }    } *root;    void add(node *cur, line nf) {      long long m = (cur->l + cur->r) / 2;      bool bl = eval(nf, cur->l) < eval(cur->f, cur->l);      bool bm = eval(nf, m) < eval(cur->f, m);      if (bm) swap(cur->f, nf);      if (cur->r - cur->l == 1) return;      if (bl != bm) {        if (cur->left == nullptr) cur->left = new node(cur->l, m);        add(cur->left, nf);      } else {        if (cur->right == nullptr) cur->right = new node(m, cur->r);        add(cur->right, nf);      }    }    long long query(node *cur, long long x) {      if (cur == nullptr) return LINF;      if (cur->r - cur->l == 1) return eval(cur->f, x);      long long m = (cur->l + cur->r) / 2;      if (x < m) return min(eval(cur->f, x), query(cur->left, x));      else return min(eval(cur->f, x), query(cur->right, x));    }  public:    li_chao_tree(long long l, long long r) {      root = new node(l, r);    }        void add(long long m, long long b) {      add(root, {m, b});    }    long long query(long long x) {      return query(root, x);    }};long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) {  for (int i = 0; i < n; i++) if (r[i] > c[i]) swap(r[i], c[i]);  vii segments;  for (int i = 0; i < n; i++) segments.push_back({r[i], c[i]});  sort(segments.begin(), segments.end(), [&](const ii &a, const ii &b) {    if (a.first == b.first) return a.second > b.second;    return a.first < b.first;  });  vi nr = {segments[0].first}, nc = {segments[0].second};  for (int i = 1; i < n; i++) {    if (!(nr.back() <= segments[i].first && segments[i].second <= nc.back())) {      nr.push_back(segments[i].first);      nc.push_back(segments[i].second);    }  }  swap(r, nr); swap(c, nc); n = (int) r.size();  debug(r, c);  vector<vll> dp(n + 1, vll(k + 1, LINF)); dp[0].assign(k + 1, 0);  vector<li_chao_tree> lct(k + 1, li_chao_tree(0, 0));  for (int j = 0; j <= k; j++) lct[j] = li_chao_tree(0, m);  for (int j = 0; j < k; j++) lct[j].add(-2 * r[0], (ll) r[0] * r[0] - 2 * r[0]);  for (int i = 1; i <= n; i++) {    for (int j = 1; j <= k; j++) dp[i][j] = lct[j - 1].query(c[i - 1]) + (ll) (c[i - 1] + 1) * (ll) (c[i - 1] + 1);    if (i < n) for (int j = 0; j <= k; j++) {      lct[j].add(-2 * r[i], dp[i][j] + (ll) r[i] * r[i] - 2 * r[i] - max(0ll, (ll) c[i - 1] - r[i] + 1) * max(0ll, (ll) c[i - 1] - r[i] + 1));    }  }  debug(dp);  return dp[n][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...