Submission #24626

#TimeUsernameProblemLanguageResultExecution timeMemory
24626gs14004Shortcut (IOI16_shortcut)C++11
100 / 100
1609 ms95780 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; typedef long long lint; typedef pair<lint, lint> pi; struct Fucking_locality{ lint arg1, arg2; lint first; int second; bool operator<(const Fucking_locality &fuck)const{ return make_pair(first, second) < make_pair(fuck.first, fuck.second); } }; int n, c; lint a[1000005], b[1000005]; Fucking_locality v[1000005], w[1000005]; bool trial(lint x){ lint ps = -1e18, pe = 1e18, ms = -1e18, me = 1e18; lint mx = -1e18, mxp = -1, smx = -1e18; lint mn = 1e18, mnp = -1, smn = 1e18; int p = 0; for(int i=0; i<n; i++){ while(p < n && w[p].first + x < v[i].first){ lint cmx = w[p].arg1; lint cmn = w[p].arg2; if(mx < cmx){ smx = mx; mx = cmx; mxp = w[p].second; } else if(smx < cmx) smx = cmx; if(mn > cmn){ smn = mn; mn = cmn; mnp = w[p].second; } else if(smn > cmn) smn = cmn; p++; } lint q1 = (v[i].second != mxp ? mx : smx); lint q2 = (v[i].second != mnp ? mn : smn); lint ca = v[i].arg1; lint cb = v[i].arg2; ps = max(ps, q1 - x + c + cb + ca); pe = min(pe, q2 + x - c + cb - ca); ms = max(ms, q1 - x + c - cb + ca); me = min(me, q2 + x - c - cb - ca); } p = 0; for(int i=0; i<n; i++){ lint s = max(ps - b[i], b[i] - me); lint e = min(pe - b[i], b[i] - ms); while(p < n && s > b[p]) p++; while(p > 0 && s <= b[p-1]) p--; while(p < n && b[p] <= e) return true; } return false; } long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) { ::n = n; ::c = c; for(int i=0; i<n; i++){ a[i] = d[i]; if(i >= 1) b[i] = b[i-1] + l[i-1]; } for(int i=0; i<n; i++){ v[i] = (Fucking_locality){a[i], b[i], a[i] + b[i], i}; w[i] = (Fucking_locality){a[i] + b[i], -a[i] + b[i], -a[i] + b[i], i}; } sort(v, v+n); sort(w, w+n); lint s = 0, e = 2e15; while(s != e){ lint m = (s+e)/2; if(trial(m)) e = m; else s = m+1; } return s; }
#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...