Submission #784788

#TimeUsernameProblemLanguageResultExecution timeMemory
784788aymanrsShortcut (IOI16_shortcut)C++14
38 / 100
2074 ms141260 KiB
#include<bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt") using namespace std; long long find_shortcut(int n, vector<int> l, vector<int> d, int c){ long long L = 1, R = (long long)1e9 * (n+1), M, B = R; long long t[n]; pair<long long, long long> mtd[n][n]; t[0] = 0; for(int i = 1;i < n;i++) t[i] = l[i-1]+t[i-1]; for(int i = 0;i < n;i++){ for(int j = i+1;j < n;j++){ mtd[i][j-i-1] = make_pair(t[j]+d[j], t[j]-d[j]); } sort(mtd[i], mtd[i]+n-i-1); long long nex = LONG_LONG_MAX; for(int j = n-1;j > i;j--){ nex = mtd[i][j-i-1].second = min(mtd[i][j-i-1].second, nex); } } while(L <= R){ M = L+(R-L)/2; bool ok = false; long long sp[n]; for(int j = 0;j < n-1;j++){ if(mtd[j][n-j-2].first-t[j]+d[j] <= M) continue; sp[j] = lower_bound(mtd[j], mtd[j]+n-j-1, make_pair(M+t[j]-d[j]+1, LONG_LONG_MIN))->second; } for(int i = 0;i < n;i++){ long long le = 0, re = LONG_LONG_MAX; for(int j = 0;j < n-1;j++){ if(mtd[j][n-j-2].first-t[j]+d[j] <= M) continue; le = max(le, abs(t[j]-t[i])+mtd[j][n-j-2].first+d[j]+c-M); re = min(re, sp[j]-abs(t[j]-t[i])-d[j]+M-c); } for(int j=0;j < n;j++) ok |= le <= t[j] && t[j] <= re; } if(ok) { R = M-1; B = M; } else L = M+1; } return B; } // int main(){ // cout << find_shortcut(9, {10, 10, 10, 10, 10, 10, 10, 10},{20, 0, 30, 0, 0, 40, 0, 40, 0}, 30) << '\n'; // }
#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...