Submission #1233058

#TimeUsernameProblemLanguageResultExecution timeMemory
1233058LemserShortcut (IOI16_shortcut)C++20
0 / 100
0 ms328 KiB
#include "shortcut.h" #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx2") #pragma GCC target("popcnt") using namespace std; using ll = long long; using ull = unsigned long long; using lld = long double; using ii = pair<int,int>; using pll = pair<ll, ll>; using vi = vector<int>; using vll = vector<ll>; using vii = vector<ii>; using vpll = vector<pll>; using vlld = vector<lld>; #define all(x) x.begin(),x.end() #define lsb(x) x&(-x) #define gcd(a,b) __gcd(a,b) #define sz(x) (int)x.size() #define mp make_pair #define pb push_back #define fi first #define se second #define fls cout.flush() #define fore(i, l, r) for (auto i = l; i < r; i++) #define fo(i, n) fore (i, 0, n) #define forex(i, r, l) for (auto i = r-1; i >= l; i--) #define ffo(i, n) forex (i, n, 0) bool cmin(ll &a, ll b) { if (b < a) { a=b; return 1; } return 0; } bool cmax(ll &a, ll b) { if (b > a) { a=b; return 1; } return 0; } const ll INF = 1e18; long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) { vll pf(n, 0); fore (i, 1, n) pf[i] = pf[i-1] + l[i-1]; // ll ans = INF; // fo (l, n) { // fore (r, l+1, n) { // ll mx = 0; // fo (i, n) { // fore (j, i+1, n) { // mx = max(mx, min(abs(pf[j] - pf[i]), abs(pf[l] - pf[i]) + c + abs(pf[r] - pf[j])) + d[i] + d[j]); // } // } // ans = min(ans, mx); // } // } vector<vll> c1(n+1, vll(n+1, INF)), c2(n+1, vll(n+1, INF)), c3(n+1, vll(n+1, INF)), c4(n+1, vll(n+1, INF)); ll lb = 1, rb = 1e9 * (n + 2); while (lb <= rb) { ll m = (lb+rb)/2; bool can = 0; fo (i, n) { fore (j, i+1, n) { c1[i][j] = INF; c2[i][j] = INF; c3[i][j] = INF; c4[i][j] = INF; // este ya funciona if (pf[j]-pf[i] + d[i] + d[j] <= m) continue; c1[i][j] = m - c - d[i] - d[j] - pf[i] - pf[j]; c2[i][j] = m - c - d[i] - d[j] + pf[i] - pf[j]; c3[i][j] = m - c - d[i] - d[j] - pf[i] + pf[j]; c4[i][j] = m - c - d[i] - d[j] + pf[i] + pf[j]; } } ffo (i, n) { ffo (j, n) { c1[i][j] = min({c1[i+1][j], c1[i][j+1], c1[i][j]}); } } fo (i, n) { ffo (j, n) { c2[i][j] = min({(i>0 ? c2[i-1][j] : INF), c2[i][j+1], c2[i][j]}); } } ffo (i, n) { fo (j, n) { c3[i][j] = min({c3[i+1][j], (j>0 ? c3[i][j-1] : INF), c3[i][j]}); } } fo (i, n) { fo (j, n) { c4[i][j] = min({(i>0 ? c4[i-1][j] : INF), (j>0 ? c4[i][j-1] : INF), c4[i][j]}); bool f = 1; f &= (- pf[i] - pf[j] <= c1[i][j]); if (i > 0) f &= (+ pf[i] - pf[j] <= c2[i-1][j]); if (j > 0) f &= (- pf[i] + pf[j] <= c3[i][j-1]); if (i > 0 && j > 0) f &= (+ pf[i] + pf[j] <= c4[i-1][j-1]); can |= f; if (can) break; } if (can) break; } if (can) rb = m-1; else lb = m+1; } return lb; }

Compilation message (stderr)

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...