Submission #1065573

#TimeUsernameProblemLanguageResultExecution timeMemory
1065573onbertShortcut (IOI16_shortcut)C++17
31 / 100
2009 ms604 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e5 + 5, INF = 1e18; int n, c; pair<int,int> a[maxn]; pair<int,int> calc(vector<pair<int,int>> vec) { int sz = vec.size(); int sum = 0; for (auto [L, D]:vec) sum += L; int mid = 0, dist = 0; while (dist + vec[mid].first <= sum - dist - vec[mid].first) { dist += vec[mid].first; mid++; } int mx = 0, mxi = 0; dist = 0; for (int i=1;i<=mid;i++) { dist += vec[i-1].first; if (vec[i].second + dist > mx) mxi = i, mx = vec[i].second + dist; } // cout << mx << " " << mxi << endl; dist = 0; for (int i=sz-1;i>mid;i--) { dist += vec[i].first; if (vec[i].second + dist > mx) mxi = i, mx = vec[i].second + dist; } // cout << mx << " " << mxi << endl; // cout << "test\n"; // for (auto [x, y]:vec) cout << x << " " << y << endl; // cout << "ret " << mx << " " << mxi << endl; // cout << endl; return {mx + vec[0].second, mxi}; } int calc2(vector<pair<int,int>> vec) { int sz = vec.size(); int ps[sz]; ps[0] = 0; for (int i=1;i<sz;i++) ps[i] = ps[i-1] + vec[i-1].first; int sum = ps[sz-1] + c; int mx = 0; for (int i=0;i<sz;i++) for (int j=i+1;j<sz;j++) { int dist = ps[j] - ps[i]; if (sum - dist < dist) dist = sum - dist; mx = max(dist + vec[i].second + vec[j].second, mx); } return mx; } int cnt(int l, int r) { if (l==r) return INF; int sz = r-l+1; vector<pair<int,int>> cur; int dist = 0, mx = 0; int ps[n]; ps[0] = 0; for (int i=1;i<n;i++) ps[i] = ps[i-1] + a[i-1].first; for (int i=l;i>=0;i--) { // if (i!=l) MX += a[i].first; // lhs = max(a[i].second + MX, lhs); // MX = max(a[i].second, MX); mx = max(ps[l] - ps[i] + a[i].second, mx); } cur.push_back({a[l].first, mx}); for (int i=l+1;i<r;i++) cur.push_back({a[i].first, a[i].second}); dist = mx = 0; for (int i=r;i<n;i++) { // if (i!=r) MX += a[i-1].first; // rhs = max(a[i].second + MX, rhs); // MX = max(a[i].second, MX); mx = max(ps[i] - ps[r] + a[i].second, mx); } cur.push_back({c, mx}); int lhs = 0; for (int i=0;i<=l;i++) for (int j=i+1;j<=l;j++) lhs = max(ps[j]-ps[i] + a[i].second + a[j].second, lhs); int rhs = 0; for (int i=r;i<n;i++) for (int j=i+1;j<n;j++) rhs = max(ps[j]-ps[i] + a[i].second + a[j].second, rhs); int both = 0; for (int i=0;i<=l;i++) for (int j=r;j<n;j++) { int dist = ps[j] - ps[i] - (ps[r] - ps[l]) + min(ps[r] - ps[l], c); both = max(dist + a[i].second + a[j].second, both); } return max({calc2(cur), lhs, rhs, both}); // int start = calc(cur).second; // vector<pair<int,int>> cur2; // for (int i=0;i<sz;i++) cur2.push_back(cur[(i+start)%sz]); // int val = calc(cur2).first; } long long find_shortcut(int32_t N, vector<int32_t> L, vector<int32_t> d, int32_t C) { if (N >= 1000) return 69420; n = N, c = C; for (int i=0;i<n-1;i++) a[i] = {L[i], d[i]}; a[n-1] = {-1, d[n-1]}; int ps[n]; ps[0] = 0; for (int i=1;i<n;i++) ps[i] = ps[i-1] + a[i-1].first; int ans = 0; for (int i=0;i<n;i++) for (int j=i+1;j<n;j++) ans = max(ps[j]-ps[i] + a[i].second + a[j].second, ans); for (int i=0;i<n;i++) for (int j=i+1;j<n;j++) ans = min(cnt(i, j), ans); return ans; for (int i=0;i<n-1;i++) { // for (int j=i+1;j<n;j++) cout << cnt(i, j) << " "; // cout << endl; int l = i, r = n-1; while (l<r) { int mid = (l+r)/2; if (cnt(i, mid) < cnt(i, mid+1)) r = mid; else l = mid+1; } ans = min(cnt(i, l), ans); } return ans; }

Compilation message (stderr)

shortcut.cpp: In function 'long long int cnt(long long int, long long int)':
shortcut.cpp:54:9: warning: unused variable 'sz' [-Wunused-variable]
   54 |     int sz = r-l+1;
      |         ^~
shortcut.cpp:56:9: warning: variable 'dist' set but not used [-Wunused-but-set-variable]
   56 |     int dist = 0, mx = 0;
      |         ^~~~
#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...