Submission #121724

#TimeUsernameProblemLanguageResultExecution timeMemory
121724nvmdavaShortcut (IOI16_shortcut)C++17
100 / 100
1782 ms127736 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; #define inf 10000000000000000LL int n, c; vector<long long> xpd, xmd; vector<long long> x; int sp[1000005][20]; int lg[1000005]; int get(int l, int r){ int sz = lg[r - l + 1]; int q2 = sp[r][sz]; int q1 = sp[l + (1 << sz) - 1][sz]; if(xmd[q1] < xmd[q2]) return q1; return q2; } bool pos(long long len){ long long bpmx, bpmn, bmmx, bmmn, pmx, mmn, f = len - c; bpmx = bmmx = mmn = inf; bpmn = bmmn = pmx = -inf; int mid = 0; int itm = 0, itp = 0, t = 0, r; for(itp = 1; itp < n; itp++){ if(xpd[itp] - xmd[mid] > len) break; if(xmd[itp] <= xmd[mid]) mid = itp; } t = mid; for(;itp < n; itp++){ if(t != itp - 1){ r = get(t + 1, itp - 1); while(xpd[itp] - xmd[r] > len){ t = r; if(t == itp - 1) break; r = get(t + 1, itp - 1); } } while(itm <= t){ mmn = min(mmn, xmd[itm]); pmx = max(pmx, xpd[itm]); itm++; } bpmx = min(bpmx, f + mmn + xmd[itp]); bpmn = max(bpmn, -f + pmx + xpd[itp]); bmmx = min(bmmx, f - pmx + xmd[itp]); bmmn = max(bmmn, -f - mmn + xpd[itp]); if(bmmx < bmmn || bpmx < bpmn) return 0; } int i, imn = 0, imx = 0; for(i = 0; i < n; i++){ while(imx < n && x[i] - x[imx] > bmmx) imx++; while(imn < n && x[i] - x[imn] >= bmmn) imn++; if(imn > imx){ if(x[i] + x[imn - 1] <= bpmx && x[i] + x[imn - 1] >= bpmx) return 1; if(x[i] + x[imx] <= bpmx && x[i] + x[imx] >= bpmx) return 1; } } imn = n - 1; imx = n - 1; for(i = 0; i < n; i++){ while(imx >= 0 && x[i] + x[imx] > bpmx) imx--; while(imn >= 0 && x[i] + x[imn] >= bpmn) imn--; if(i > imx) return 0; if(imn < imx){ if(x[imx] - x[i] <= bmmx && x[imx] - x[i] >= bmmn) return 1; if(x[imn + 1] - x[i] <= bmmx && x[imn + 1] - x[i] >= bmmn) return 1; } } return 0; } long long find_shortcut(int n, vector<int> le, vector<int> d, int c){ long long m, l = 0, r; ::c = c; ::n = n; x.push_back(0); for(auto& t : le){ x.push_back(x.back() + t); } for(int i = 0; i < n; i++){ xpd.push_back(x[i] + d[i]); xmd.push_back(x[i] - d[i]); } r = x[n - 1] + 2000000000; for(int i = 0; i < n; i++){ sp[i][0] = i; for(int j = 1; j < 20; j++){ if((1 << j) > i) break; int q1, q2; q1 = sp[i][j - 1]; q2 = sp[i - (1 << (j - 1))][j - 1]; if(xmd[q1] < xmd[q2]) sp[i][j] = q1; else sp[i][j] = q2; } } for(int i = 2; i < n; i++){ lg[i] = lg[i >> 1] + 1; } while(l != r){ m = (l + r) >> 1; if(pos(m)) r = m; else l = m + 1; } return l; }
#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...