#include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> typedef long long LL; using namespace std; struct Data { LL sum; LL best; LL bestL; LL bestR; }; Data compute(int x) { Data result; result.sum = GetTaste(x); result.best = min(0ll, result.sum); result.bestL = result.bestR = result.best; return result; } Data collect(Data left, Data right) { Data result; result.sum = left.sum + right.sum; result.best = min(left.best, right.best); result.best = min(result.best, left.bestR + right.bestL); result.bestL = min(left.bestL, left.sum + right.bestL); result.bestR = min(left.bestR + right.sum, right.bestR); return result; } Data compute(int left, int right) { Data result = compute(left); for(int i=left+1; i<right; i++) { result = collect(result, compute(i)); } return result; } void sendData(Data data) { PutLL(0, data.sum); PutLL(0, data.best); PutLL(0, data.bestL); PutLL(0, data.bestR); Send(0); } Data receiveData(int from) { Receive(from); Data result; result.sum = GetLL(from); result.best = GetLL(from); result.bestL = GetLL(from); result.bestR = GetLL(from); return result; } int main() { int N = GetN(); int nodes = NumberOfNodes(); nodes = min(nodes, N); int me = MyNodeId(); if(me >= nodes) { return 0; } Data portion = compute(LL(N) * me / nodes, LL(N) * (me+1) / nodes); if(me != 0) { sendData(portion); } else { for(int i=1; i<nodes; i++) { portion = collect(portion, receiveData(i)); } LL result = portion.sum - portion.best; cout << result << "\n"; } 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> typedef long long LL; using namespace std; struct Data { LL sum; LL best; LL bestL; LL bestR; }; Data compute(int x) { Data result; result.sum = GetTaste(x); result.best = min(0ll, result.sum); result.bestL = result.bestR = result.best; return result; } Data collect(Data left, Data right) { Data result; result.sum = left.sum + right.sum; result.best = min(left.best, right.best); result.best = min(result.best, left.bestR + right.bestL); result.bestL = min(left.bestL, left.sum + right.bestL); result.bestR = min(left.bestR + right.sum, right.bestR); return result; } Data compute(int left, int right) { Data result = compute(left); for(int i=left+1; i<right; i++) { result = collect(result, compute(i)); } return result; } void sendData(Data data) { PutLL(0, data.sum); PutLL(0, data.best); PutLL(0, data.bestL); PutLL(0, data.bestR); Send(0); } Data receiveData(int from) { Receive(from); Data result; result.sum = GetLL(from); result.best = GetLL(from); result.bestL = GetLL(from); result.bestR = GetLL(from); return result; } int main() { int N = GetN(); int nodes = NumberOfNodes(); nodes = min(nodes, N); int me = MyNodeId(); if(me >= nodes) { return 0; } Data portion = compute(LL(N) * me / nodes, LL(N) * (me+1) / nodes); if(me != 0) { sendData(portion); } else { for(int i=1; i<nodes; i++) { portion = collect(portion, receiveData(i)); } LL result = portion.sum - portion.best; cout << result << "\n"; } return 0; } |