Submission #46486

#TimeUsernameProblemLanguageResultExecution timeMemory
46486RockyBBuilding Bridges (CEOI17_building)C++17
30 / 100
3036 ms4268 KiB
/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include <bits/stdc++.h> #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)1e5 + 7; const int K = 317; const int inf = (int)1e9 + 7; const int mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}; const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int n; int h[N], w[N]; ll dp[N], s[N]; struct line { ll k, b; ll get(ll x) { return k * x + b; } bool operator < (const line &x) const { if (k != x.k) return k < x.k; return b < x.b; } }; double inter(line a, line b) { return (b.b - a.b) / (a.k - b.k); } struct cht { vector <line> a, b; void build() { for (auto it : b) a.pb(it); b.clear(); sort(all(a)); vector <line> nw; for (auto it : a) { if (sz(nw) && nw.back().k == it.k) continue; while (sz(nw) > 1 && inter(it, nw.back()) <= inter(it, nw[sz(nw) - 2])) nw.pp(); nw.pb(it); } } ll get(ll x) { int l = 0, r = sz(a) - 2, res = 0; while (l <= r) { int mid = l + r >> 1; if (a[mid].get(x) >= a[mid + 1].get(x)) res = mid + 1, l = mid + 1; else r = mid - 1; } ll ans = sz(a) ? a[res].get(x) : linf; //ll ans = linf; for (auto it : b) { ans = min(ans, it.get(x)); } return ans; } void add(line x) { b.pb(x); //if (sz(b) >= K) build(); } } t; int main() { #ifdef IOI2018 freopen ("in.txt", "r", stdin); #endif Kazakhstan cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i]; } for (int i = 1; i <= n; i++) { cin >> w[i]; s[i] = s[i - 1] + w[i]; } memset(dp, 0x3f, sizeof(dp)); dp[1] = 0; t.add({h[1], sqr(h[1]) + dp[1] - s[1]}); for (int i = 2; i <= n; i++) { dp[i] = t.get(-2 * h[i]) + sqr(h[i]) + s[i - 1]; t.add({h[i], sqr(h[i]) + dp[i] - s[i]}); /*ll add = 0; for (int j = i - 1; j >= 1; j--) { dp[i] = min(dp[i], sqr(h[i] - h[j]) + (s[i - 1] - s[j]) + dp[j]); add += w[j]; }*/ } cout << dp[n]; ioi }

Compilation message (stderr)

building.cpp: In member function 'll cht::get(ll)':
building.cpp:73:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    int mid = l + r >> 1;
              ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...