Submission #827160

#TimeUsernameProblemLanguageResultExecution timeMemory
827160wortelwormRice Hub (IOI11_ricehub)C++17
100 / 100
134 ms1620 KiB
#include "ricehub.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; int besthub(int RiceCount, int Length, int RiceFields[], long long Budget) { if (RiceCount <= 5000) { ll best_count = 0; for (ll i = 0; i < RiceCount; i++) { ll x = RiceFields[i]; ll cost = 0; ll count = 1; ll backwards_index = i-1; ll forwards_index = i+1; while (cost <= Budget) { if (backwards_index < 0 && forwards_index >= RiceCount) { return RiceCount; } ll backwards = backwards_index < 0 ? 1e9 : x-RiceFields[backwards_index]; ll forwards = forwards_index >= RiceCount ? 1e9 : RiceFields[forwards_index]-x; if (forwards < backwards) { cost += forwards; forwards_index++; count++; } else { cost += backwards; backwards_index--; count++; } } count --; best_count = max(best_count, count); } return best_count; } ll count_before = 0; ll count_after = 0; ll cost = 0; ll best_count = 1; for (ll i = 1; i < RiceCount; i++) { // set the hub at this field ll x = RiceFields[i]; ll distance = RiceFields[i] - RiceFields[i-1]; // account for the prev_index now also having distance count_before++; cost += distance * count_before; cost -= distance * count_after; if (count_after > 0) { count_after --; } auto add_after = [&](){ while (cost <= Budget && i+count_after < RiceCount-1) { count_after++; cost += RiceFields[i+count_after] - x; } if (cost > Budget && count_after > 0) { cost -= RiceFields[i+count_after] - x; count_after--; } }; add_after(); while ( count_before > 0 && ( cost > Budget || ( i+count_after < RiceCount-1 && (x - RiceFields[i-count_before]) >= (RiceFields[i+count_after+1] - x) ) )) { cost -= x - RiceFields[i-count_before]; count_before--; add_after(); } ll current_count = count_before + count_after + 1; if (current_count > best_count) { best_count = current_count; } } return best_count; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...