Submission #789682

#TimeUsernameProblemLanguageResultExecution timeMemory
7896821neShortcut (IOI16_shortcut)C++14
31 / 100
2074 ms1960 KiB
#include <cstdio> #include <cassert> #include "shortcut.h" #pragma once #include <vector> #include <bits/stdc++.h> using namespace std; struct node{ long long x,y,d; }; long long find_shortcut(int n, std::vector <int> ll, std::vector <int> d, int c){ vector<long long>pref_max(n,0); vector<long long>suff_max(n,0); for (int i = 0 ;i<n;++i){ if (i == 0){ pref_max[i] = d[i]; } else{ pref_max[i] = max((long long)d[i],pref_max[i - 1] + ll[i - 1]); } } for (int i = n - 1;i>=0;--i){ if (i == n - 1){ suff_max[i] = d[i]; } else{ suff_max[i] = max((long long)d[i],suff_max[i + 1] + ll[i]); } } vector<long long>pref_seg(n,0); vector<long long>suff_seg(n,0); for (int i = 0;i<n;++i){ if (i == 0){ pref_seg[i] = d[i]; } else{ pref_seg[i] = max(pref_seg[i - 1],pref_max[i - 1] + ll[i - 1] + d[i]); } } for (int i = n - 1;i>=0;--i){ if (i == n - 1){ suff_seg[i] = d[i]; } else{ suff_seg[i] = max(suff_seg[i + 1],suff_max[i + 1] + ll[i] + d[i]); } } vector<long long>pref(n,0); for (int i = 0;i<n - 1;++i){ pref[i + 1] = pref[i] + ll[i]; } auto query = [&](int l,int r){ if (l > r){ swap(l,r); } return pref[r] - pref[l]; }; long long v = query(0,1); for (int i = 0;i<n - 1;++i){ v = max(v,pref_max[i] + suff_max[i + 1] + ll[i]); } auto check = [&](long long mid){ vector<node>pos; for (int i = 0;i<n;++i){ for (int j = i + 1;j<n;++j){ if (d[i] + d[j] + query(i,j) > mid){ pos.push_back({i,j,mid - d[i] - d[j] - c}); } } } sort(pos.begin(),pos.end(),[&](auto x,auto y){ if (x.d == y.d)return x.y < y.y; return x.d < y.d; }); for (int i = 0;i<n;++i){ bool valid = true; for (int j = i + 1;j<n;++j){ bool ok = true; for (auto x:pos){ if (query(i,x.x) + query(j,x.y) <= x.d || query(i,x.y) + query(j,x.x) <= x.d){ continue; } ok = false; if (x.y <= j){ valid = false; } break; } if (ok){ return 1; } if (!valid)break; } } return 0; }; long long pos = 0; long long left = 0,right = 1e12; while(left<=right){ long long mid = (left + right)>>1; if (check(mid)){ right = mid - 1; pos = mid; } else{ left = mid + 1; } } return pos; }

Compilation message (stderr)

shortcut.cpp:4:9: warning: #pragma once in main file
    4 | #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...