#include <bits/stdc++.h> #include "kanapka.h" #include "message.h" using namespace std; typedef long long ll; pair<ll, ll> divide(ll n) { auto f = [](ll n, int i, int k) { return n * i / k; }; return make_pair(f(n, MyNodeId(), NumberOfNodes()), f(n, MyNodeId() + 1, NumberOfNodes())); } int main() { // Local computation ll nl, nr; tie(nl, nr) = divide(GetN()); // Total and left max { ll s = 0, sl = 0, sr = 0, sans = 0; for (ll i = nl; i < nr; ++i) { ll x = -GetTaste(i);; s += x; sl = max(sl, s); sr = max(sr + x, 0LL); sans = max(sans, sr); } // Send it, and compute! PutLL(0, s); PutLL(0, sl); PutLL(0, sr); PutLL(0, sans); // printf("[%lld, %lld): %lld %lld %lld %lld\n", nl, nr, s, sl, sr, sans); Send(0); } // DP if (MyNodeId() == 0) { ll ans = 0, dp = 0, total = 0; for (int i = 0; i < NumberOfNodes(); ++i) { Receive(i); ll ts = GetLL(i); ll tsl = GetLL(i); ll tsr = GetLL(i); ll tsans = GetLL(i); ans = max(ans, max(tsans, dp + tsl)); dp = max(dp + ts, tsr); total += ts; } printf("%lld\n", -(total - ans)); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <bits/stdc++.h> #include "kanapka.h" #include "message.h" using namespace std; typedef long long ll; pair<ll, ll> divide(ll n) { auto f = [](ll n, int i, int k) { return n * i / k; }; return make_pair(f(n, MyNodeId(), NumberOfNodes()), f(n, MyNodeId() + 1, NumberOfNodes())); } int main() { // Local computation ll nl, nr; tie(nl, nr) = divide(GetN()); // Total and left max { ll s = 0, sl = 0, sr = 0, sans = 0; for (ll i = nl; i < nr; ++i) { ll x = -GetTaste(i);; s += x; sl = max(sl, s); sr = max(sr + x, 0LL); sans = max(sans, sr); } // Send it, and compute! PutLL(0, s); PutLL(0, sl); PutLL(0, sr); PutLL(0, sans); // printf("[%lld, %lld): %lld %lld %lld %lld\n", nl, nr, s, sl, sr, sans); Send(0); } // DP if (MyNodeId() == 0) { ll ans = 0, dp = 0, total = 0; for (int i = 0; i < NumberOfNodes(); ++i) { Receive(i); ll ts = GetLL(i); ll tsl = GetLL(i); ll tsr = GetLL(i); ll tsans = GetLL(i); ans = max(ans, max(tsans, dp + tsl)); dp = max(dp + ts, tsr); total += ts; } printf("%lld\n", -(total - ans)); } return 0; } |