#include <bits/stdc++.h> #include "message.h" #include "kanapka.h" #define FOR(i, a, b) for (int (i)=(a); (i)<(b); (i)++) #define PPC(x) __builtin_popcountll((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back using namespace std; void remin(long long& a, long long b) { a = min(a, b); } void remax(long long& a, long long b) { a = max(a, b); } int main() { int Nds = NumberOfNodes(), ja = MyNodeId(), p = GetN() / Nds; int Beg = ja * p, End = ja == Nds-1 ? GetN() : Beg + p; long long res = 0, mn = 0, mx = 0, sum = 0; FOR(i, Beg, End) { sum += GetTaste(i); remin(res, sum - mx); remin(mn, sum); remax(mx, sum); } for (int m=1; m<Nds; m*=2) { int other = ja ^ m; if (ja & m) { PutLL(other, res); PutLL(other, mn); PutLL(other, mx); PutLL(other, sum); Send(other); return 0; } if (other >= Nds) continue; Receive(other); remin(res, GetLL(other)); long long hismin = GetLL(other) + sum; remin(res, hismin - mx); remin(mn, hismin); remax(mx, GetLL(other) + sum); sum += GetLL(other); } res = sum - res; printf("%lld\n", res); 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 55 56 57 58 59 60 | #include <bits/stdc++.h> #include "message.h" #include "kanapka.h" #define FOR(i, a, b) for (int (i)=(a); (i)<(b); (i)++) #define PPC(x) __builtin_popcountll((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back using namespace std; void remin(long long& a, long long b) { a = min(a, b); } void remax(long long& a, long long b) { a = max(a, b); } int main() { int Nds = NumberOfNodes(), ja = MyNodeId(), p = GetN() / Nds; int Beg = ja * p, End = ja == Nds-1 ? GetN() : Beg + p; long long res = 0, mn = 0, mx = 0, sum = 0; FOR(i, Beg, End) { sum += GetTaste(i); remin(res, sum - mx); remin(mn, sum); remax(mx, sum); } for (int m=1; m<Nds; m*=2) { int other = ja ^ m; if (ja & m) { PutLL(other, res); PutLL(other, mn); PutLL(other, mx); PutLL(other, sum); Send(other); return 0; } if (other >= Nds) continue; Receive(other); remin(res, GetLL(other)); long long hismin = GetLL(other) + sum; remin(res, hismin - mx); remin(mn, hismin); remax(mx, GetLL(other) + sum); sum += GetLL(other); } res = sum - res; printf("%lld\n", res); return 0; } |