Submission #1046220

#TimeUsernameProblemLanguageResultExecution timeMemory
1046220Gromp15Shortcut (IOI16_shortcut)C++17
38 / 100
2072 ms282792 KiB
#include "shortcut.h" #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #include <bits/stdc++.h> #define ll long long using namespace std; template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } long long find_shortcut(int n, std::vector<int> L, std::vector<int> d, int c) { vector<ll> p(n); for (int i = 1; i < n; i++) p[i] = p[i-1] + L[i-1]; ll l = 0, r = 1e18, ans = 1e18; while (l <= r) { ll mid = (l+r)/2; int max_l = n-1, min_r = 0; bool bad = 0; vector<vector<ll>> pp(n, vector<ll>(n, -1e18)), ps(n, vector<ll>(n, -1e18)), sp(n, vector<ll>(n, 1e18)), ss(n, vector<ll>(n, 1e18)); for (int k = 0; k < n; k++) { for (int l = k+1; l < n; l++) if (d[k] + d[l] + p[l] - p[k] > mid) { ckmax(min_r, k); ckmin(max_l, l); // d[k] + d[l] + abs(p[i] - p[k]) + abs(p[j] - p[l]) + c <= mid // abs(p[i] - p[k]) + abs(p[j] - p[l]) <= mid - c - d[k] - d[l] ll cons = mid - c - d[k] - d[l]; ckmax(pp[k][l], p[k] + p[l] - cons); ckmax(ps[k][l], p[k] - p[l] - cons); ckmin(sp[k][l], cons + p[k] - p[l]); ckmin(ss[k][l], cons + p[k] + p[l]); /* for (int i = 0; i <= k; i++) for (int j = 0; j <= l; j++) { if (p[i] + p[j] < p[k] + p[l] - cons) { can[i][j] = 0; } } for (int i = 0; i <= k; i++) for (int j = l; j < n; j++) { if (p[i] - p[j] < p[k] - p[l] - cons) { can[i][j] = 0; } } for (int i = k; i < n; i++) for (int j = 0; j <= l; j++) { if (p[i] - p[j] > cons + p[k] - p[l]) { can[i][j] = 0; } } for (int i = k; i < n; i++) for (int j = l; j < n; j++) { if (p[i] + p[j] > cons + p[k] + p[l]) { can[i][j] = 0; } } */ } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i) ckmin(ss[i][j], ss[i-1][j]); if (j) ckmin(ss[i][j], ss[i][j-1]); } for (int j = n-1; j >= 0; j--) { if (i) ckmin(sp[i][j], sp[i-1][j]); if (j+1 < n) ckmin(sp[i][j], sp[i][j+1]); } } for (int i = n-1; i >= 0; i--) { for (int j = 0; j < n; j++) { if (i+1 < n) ckmax(ps[i][j], ps[i+1][j]); if (j) ckmax(ps[i][j], ps[i][j-1]); } for (int j = n-1; j >= 0; j--) { if (i+1 < n) ckmax(pp[i][j], pp[i+1][j]); if (j+1 < n) ckmax(pp[i][j], pp[i][j+1]); } } bool ok = 0; for (int i = 0; i <= max_l; i++) { for (int j = max(min_r, i + 1); j < n; j++) if (!(p[i] + p[j] < pp[i][j] || p[i] - p[j] < ps[i][j] || p[i] - p[j] > sp[i][j] || p[i] + p[j] > ss[i][j])) { ok = 1; break; } if (ok) break; } if (ok) ans = mid, r = mid-1; else l = mid+1; } return ans; }

Compilation message (stderr)

shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:18:8: warning: unused variable 'bad' [-Wunused-variable]
   18 |   bool bad = 0;
      |        ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...