Submission #1209524

#TimeUsernameProblemLanguageResultExecution timeMemory
1209524sanoShortcut (IOI16_shortcut)C++20
0 / 100
0 ms324 KiB
#include "shortcut.h" #include<iostream> #include<vector> #include<queue> #include<deque> #include<string> #include<fstream> #include<algorithm> #include <iomanip> #include<map> #include <set> #include <unordered_map> #include <stack> #include <unordered_set> #include <cmath> #include <cstdint> #include <cassert> #include <bitset> #include <random> #include <chrono> #include <cstring> #define shit short int #define ll long long #define ld long double //#define int ll #define For(i, n) for(int i = 0; i < (int)n; i++) #define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++) #define rfor(i, n) for(int i = (int)n; i >= (int)0; i--) #define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--) #define vec vector #define ff first #define ss second #define pb push_back #define pii pair<ll, ll> #define pld pair<ld, ld> #define NEK 2000000000000000 #define mod 1000000007 #define mod2 1000000009 #define rsz resize #define prv 43 #define prv2 47 #define D 8 #define trav(a,x) for (auto& a: x) #define pb push_back #define ub upper_bound #define lb lower_bound #define all(x) (x).begin(), (x).end() #define sig 0.0000001 using namespace std; class intervalac { ll n; vec<ll> l, r, in; public: intervalac(ll vel) { n = 1; while (n < vel) n *= 2; l.resize(2 * n); r.resize(2 * n); in.resize(2 * n); For(i, n) { l[i + n] = r[i + n] = i; } rffor(i, 1, (n - 1)) { l[i] = l[i * 2]; r[i] = r[i * 2 + 1]; } return; } void zmen(ll a, ll b) { a += n; in[a] = b; a /= 2; while (a) { in[a] = max(in[a * 2], in[a * 2 + 1]); a /= 2; } return; } ll daj(ll a, ll b, ll s = 1) { if (l[s] > b || r[s] < a) return 0; if (a <= l[s] && r[s] <= b) return in[s]; return max(daj(a, b, s * 2), daj(a, b, s * 2 + 1)); } }; bool check1(vec<ll>&d, vec<ll>&ps, ll k, ll mid, ll x, ll y, ll c) { ll n = d.size(); ll priamo = (ps[mid] - ps[k]); ll otocka = (ps[k] - ps[x]) + (ps[y] - ps[mid]) + c; return priamo <= otocka; } bool check2(vec<ll>& d, vec<ll >& ps, ll k, ll mid, ll x, ll y, ll c) { ll n = d.size(); ll priamo = (ps[k] - ps[mid]); ll otocka = (ps[y] - ps[k]) + (ps[mid] - ps[x]) + c; return priamo <= otocka; } ll find_shortcut(int n1, vec<int> len, vec<int> d1, int c1) { ll n = n1; ll c = c1; vec<ll> d; For(i, d1.size()) d.push_back(d1[i]); vec<ll> ps(n); ps[0] = 0; For(i, (n - 1)) { ps[i + 1] = ps[i] + len[i]; } intervalac seg1(n); intervalac seg2(n); For(i, n) { seg1.zmen(i, ((-1) * ps[i]) + d[i]); seg2.zmen(i, ps[i] + d[i]); } ll odp = NEK; For(x, n) { ffor(y, x+1, n) { //spajame x a y //nalavo od x ll lavo = seg1.daj(0, x) + ps[x]; //napravo od y ll pravo = seg2.daj(y, n) - ps[y]; ll maxi = pravo + lavo + min(ps[y] - ps[x], c); for (ll k = x+1; k < y; k++) { maxi = max(maxi, pravo + min(ps[k] - ps[x], ps[y] - ps[k] + c) + d[k]); maxi = max(maxi, lavo + min(ps[y] - ps[k], ps[k] - ps[x] + c) + d[k]); //2 situacie -> sme blizsie ku x potom binarne vyhladame najpravejsieho ku ktoremu chceme ist peso if (ps[k] - ps[x] <= (ps[y] - ps[k])) { ll l = k, r = y; while (l < r) { ll mid = (l + r + 1) / 2; if (check1(d, ps, k, mid, x, y, c)) l = mid; else r = mid - 1; } //od x po l chceme ist priamo, inak sa chceme otocit //x az k maxi = max(maxi, seg1.daj(x, k) + ps[k] + d[k]); //k az l maxi = max(maxi, seg2.daj(k, l) - ps[k] + d[k]); //l+1 az y if((l+1) <= y) maxi = max(maxi, seg1.daj(l+1, y) + ps[y] + ps[k] - ps[x] + c + d[k]); } else { //sme blizsie ku y potom binarne vyhladame najlavajsieho ku ktoremu chceme ist peso ll l = x, r = y; while (l < r) { ll mid = (l + r) / 2; if (check2(d, ps, k, mid, x, y, c)) r = mid; else l = mid + 1; } //k az y maxi = max(maxi, seg2.daj(k, y) - ps[k] + d[k]); //l az k maxi = max(maxi, seg1.daj(l, k) + ps[k] + d[k]); //x az l-1 if(x <= (l-1)) maxi = max(maxi, seg2.daj(x, l-1) - ps[x] + c + ps[y] - ps[k] + d[k]); } //binarne vyhladame takeho ze sa mi ku nemu oplati prejst peso } odp = min(odp, maxi); } } return odp; } /* signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, c; cin >> n >> c; vec<int> l(n - 1), d(n); For(i, (n - 1)) cin >> l[i]; For(i, n) cin >> d[i]; cout << find_shortcut(n, l, d, c) << '\n'; return 0; }*/

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...