#include <bits/stdc++.h> #include "message.h" #include "teatr.h" using namespace std; #define e1 first #define e2 second #define pb push_back #define mp make_pair #define boost ios_base::sync_with_stdio(false) #define eb emplace_back #define OUT(x) {cout << x; exit(0); } #define scanf(...) scanf(__VA_ARGS__)?:0 #define FOR(i, a, b) for (int i=(a); i<=(b); ++i) typedef long long ll; typedef unsigned long long ull; typedef pair <int, int> PII; typedef pair <ll, ll> PLL; typedef pair <PLL, PLL> PP; typedef unsigned int ui; const int mod = 1e9+696969; const int inf = 1e9+9; const ll INF = 1e18; const int INST = 100; const int LEN = 1000000; const int maxn = 1000100; int dr[maxn]; //int GetN() { return int(1e8); } //int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } inline int a(int i) {return 1 + GetElement(i); } inline void add(int p) { for (; p < maxn; p += p & (-p)) dr[p]++; } inline int query(int p) { ll ret = 0; for (; p > 0; p -= p & (-p)) ret += dr[p]; return ret; } int pref[LEN + 5]; int addon[LEN + 5]; int main() { ll me = MyNodeId(), n = GetN(); ll result = 0; ll pie = me * LEN; ll ost = min(n - 1, (me + 1) * LEN - 1); for (int i = pie; i <= ost; ++i) { int val = a(i); result += query(val); add(val); } if (me != 0) { PutLL(0, result); Send(0); } if (me == 0) { for (int i = 1; i < INST; ++i) { Receive(i); result += GetLL(i); } //czas pobawic sie z jedna instancja int ch = LEN; int buflen = 0; for (int i = 0; i < n; ++i) { if (ch == i) { ll delta = 0; FOR(j, 1, LEN + 2) { delta += addon[j]; addon[j] = 0; pref[j] += delta; } ch += LEN; } int val = a(i); addon[val]++; result += pref[val]; } cout << (ll)n * (ll)(n - 1)/2LL - result; 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 | #include <bits/stdc++.h> #include "message.h" #include "teatr.h" using namespace std; #define e1 first #define e2 second #define pb push_back #define mp make_pair #define boost ios_base::sync_with_stdio(false) #define eb emplace_back #define OUT(x) {cout << x; exit(0); } #define scanf(...) scanf(__VA_ARGS__)?:0 #define FOR(i, a, b) for (int i=(a); i<=(b); ++i) typedef long long ll; typedef unsigned long long ull; typedef pair <int, int> PII; typedef pair <ll, ll> PLL; typedef pair <PLL, PLL> PP; typedef unsigned int ui; const int mod = 1e9+696969; const int inf = 1e9+9; const ll INF = 1e18; const int INST = 100; const int LEN = 1000000; const int maxn = 1000100; int dr[maxn]; //int GetN() { return int(1e8); } //int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } inline int a(int i) {return 1 + GetElement(i); } inline void add(int p) { for (; p < maxn; p += p & (-p)) dr[p]++; } inline int query(int p) { ll ret = 0; for (; p > 0; p -= p & (-p)) ret += dr[p]; return ret; } int pref[LEN + 5]; int addon[LEN + 5]; int main() { ll me = MyNodeId(), n = GetN(); ll result = 0; ll pie = me * LEN; ll ost = min(n - 1, (me + 1) * LEN - 1); for (int i = pie; i <= ost; ++i) { int val = a(i); result += query(val); add(val); } if (me != 0) { PutLL(0, result); Send(0); } if (me == 0) { for (int i = 1; i < INST; ++i) { Receive(i); result += GetLL(i); } //czas pobawic sie z jedna instancja int ch = LEN; int buflen = 0; for (int i = 0; i < n; ++i) { if (ch == i) { ll delta = 0; FOR(j, 1, LEN + 2) { delta += addon[j]; addon[j] = 0; pref[j] += delta; } ch += LEN; } int val = a(i); addon[val]++; result += pref[val]; } cout << (ll)n * (ll)(n - 1)/2LL - result; return 0; } } |