#include "message.h" #include "teatr.h" #include <algorithm> #include "bits/stdc++.h" #define lld long long int #define INF 999999999 #define XD (1 << 20) using namespace std; int ta[7700000]; int tb[7700000]; int dd[2 * XD]; int ld[2 * XD]; int rd[2 * XD]; lld ile(int k, int d) { if (d < ld[k]) return dd[k]; if (d >= rd[k]) return 0; return ile(2 * k, d) + ile(2 * k + 1, d); } int main() { int id = MyNodeId(); if (id > 91) { return 0; } // result if (id == 0) { lld result = 0; for (int i = 1; i <= 91; i++) { int nr = Receive(-1); result += GetLL(nr); } cout << result << "\n"; return 0; } // getting scope (a and b = parts) int a = 0, b = 0; for (int i = 1; i < id; i++) { if (a == b) { b++; a = 0; } else { a++; } } // getting it right int n = GetN(); if (a == b) { int l = n * a / 13, r = n * (a + 1) / 13; for (int i = l; i < r; i++) ta[i - l] = GetElement(i); a = r - l; lld result = 0; for (int i = XD; i < 2 * XD; i++) { ld[i] = i - XD; rd[i] = i - XD + 1; } for (int i = XD - 1; i > 0; i--) { ld[i] = min(ld[2 * i], ld[2 * i + 1]); rd[i] = max(rd[2 * i], rd[2 * i + 1]); } for (int i = 0; i < a; i++) { b = XD + ta[i]; while (b) { dd[b]++; b = b >> 1; } result += ile(1, ta[i]); } PutLL(0, result); Send(0); return 0; } if (a < b) { int la = n * a / 13, ra = n * (a + 1) / 13; for (int i = la; i < ra; i++) ta[i - la] = GetElement(i); int lb = n * b / 13, rb = n * (b + 1) / 13; for (int i = lb; i < rb; i++) tb[i - lb] = GetElement(i); a = ra - la; b = rb - lb; sort(ta, ta + a); ta[a] = INF; sort(tb, tb + b); lld result = 0; int wa = 0; for (int i = 0; i < b; i++) { while (ta[wa] <= tb[i]) wa++; result += (a - wa); } PutLL(0, result); Send(0); } 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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include "message.h" #include "teatr.h" #include <algorithm> #include "bits/stdc++.h" #define lld long long int #define INF 999999999 #define XD (1 << 20) using namespace std; int ta[7700000]; int tb[7700000]; int dd[2 * XD]; int ld[2 * XD]; int rd[2 * XD]; lld ile(int k, int d) { if (d < ld[k]) return dd[k]; if (d >= rd[k]) return 0; return ile(2 * k, d) + ile(2 * k + 1, d); } int main() { int id = MyNodeId(); if (id > 91) { return 0; } // result if (id == 0) { lld result = 0; for (int i = 1; i <= 91; i++) { int nr = Receive(-1); result += GetLL(nr); } cout << result << "\n"; return 0; } // getting scope (a and b = parts) int a = 0, b = 0; for (int i = 1; i < id; i++) { if (a == b) { b++; a = 0; } else { a++; } } // getting it right int n = GetN(); if (a == b) { int l = n * a / 13, r = n * (a + 1) / 13; for (int i = l; i < r; i++) ta[i - l] = GetElement(i); a = r - l; lld result = 0; for (int i = XD; i < 2 * XD; i++) { ld[i] = i - XD; rd[i] = i - XD + 1; } for (int i = XD - 1; i > 0; i--) { ld[i] = min(ld[2 * i], ld[2 * i + 1]); rd[i] = max(rd[2 * i], rd[2 * i + 1]); } for (int i = 0; i < a; i++) { b = XD + ta[i]; while (b) { dd[b]++; b = b >> 1; } result += ile(1, ta[i]); } PutLL(0, result); Send(0); return 0; } if (a < b) { int la = n * a / 13, ra = n * (a + 1) / 13; for (int i = la; i < ra; i++) ta[i - la] = GetElement(i); int lb = n * b / 13, rb = n * (b + 1) / 13; for (int i = lb; i < rb; i++) tb[i - lb] = GetElement(i); a = ra - la; b = rb - lb; sort(ta, ta + a); ta[a] = INF; sort(tb, tb + b); lld result = 0; int wa = 0; for (int i = 0; i < b; i++) { while (ta[wa] <= tb[i]) wa++; result += (a - wa); } PutLL(0, result); Send(0); } return 0; } |