#include<iostream> #include "message.h" #include "teatr.h" typedef long long ll; using std::cout; /*int GetN() { return 100 * 1000 * 1000; } int GetElement(int i) { return 1 + (((ll)i * 27) + i & (i %113) + ((i % 37) ^ (i % 20)) * 3571) % 1000000; }*/ const int zakres=1e6+100; int pref[zakres]; int kek[zakres]; void ins(int x) { while(x < zakres) { kek[x]++; x += (x & (-x)); } } int collect(int x) { int ret=0; while(x > 0) { ret += kek[x]; x -= (x & (-x)); } return ret; } int main() { int n=GetN(); int ja = MyNodeId(), nodes = NumberOfNodes(); int ile = n / nodes + (n % nodes ? 1 : 0); ll wynik=0; int gran = (ja+1)*ile; if(n < gran) gran = n; int sum=0; for(int i=ja*ile; i < gran; ++i) { int a = GetElement(i); ++pref[a]; ++sum; ins(a); wynik += sum - collect(a); } for(int i=zakres-2; i > 0; --i) { pref[i] += pref[i+1]; } for(int i=gran; i < n; ++i) { int a = GetElement(i); wynik += pref[a+1]; } if(ja != 0){ PutLL(0, wynik); Send(0); } else{ for(int i=1; i < nodes; ++i) { Receive(i); wynik += GetLL(i); } cout << wynik; } }
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 | #include<iostream> #include "message.h" #include "teatr.h" typedef long long ll; using std::cout; /*int GetN() { return 100 * 1000 * 1000; } int GetElement(int i) { return 1 + (((ll)i * 27) + i & (i %113) + ((i % 37) ^ (i % 20)) * 3571) % 1000000; }*/ const int zakres=1e6+100; int pref[zakres]; int kek[zakres]; void ins(int x) { while(x < zakres) { kek[x]++; x += (x & (-x)); } } int collect(int x) { int ret=0; while(x > 0) { ret += kek[x]; x -= (x & (-x)); } return ret; } int main() { int n=GetN(); int ja = MyNodeId(), nodes = NumberOfNodes(); int ile = n / nodes + (n % nodes ? 1 : 0); ll wynik=0; int gran = (ja+1)*ile; if(n < gran) gran = n; int sum=0; for(int i=ja*ile; i < gran; ++i) { int a = GetElement(i); ++pref[a]; ++sum; ins(a); wynik += sum - collect(a); } for(int i=zakres-2; i > 0; --i) { pref[i] += pref[i+1]; } for(int i=gran; i < n; ++i) { int a = GetElement(i); wynik += pref[a+1]; } if(ja != 0){ PutLL(0, wynik); Send(0); } else{ for(int i=1; i < nodes; ++i) { Receive(i); wynik += GetLL(i); } cout << wynik; } } |