#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |