#include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; #define REP(i, x) for( int i = 0; i < x; i++ ) #define FOR(i, x) for( int i = 1; i <=x; i++ ) const int MAX_K = 1001000; int n; int my_nr; int NODES; int drzewo[MAX_K]; int wieksze[MAX_K]; int my_left; int my_right; long long wynik = 0; inline int mniejsze(int a){ int res = 0; while( a > 0 ){ res += drzewo[a]; a -= (a&-a); } return res; } inline void dodaj(int a){ while( a < MAX_K ){ drzewo[a]++; a += (a&-a); } } void init(){ n = GetN(); my_nr = MyNodeId(); NODES = NumberOfNodes(); int range = n / NODES + 1; my_left = range * my_nr; my_right = min(range * (my_nr+1), n); } void licz_wlasny(){ int ile_razem = 0; for( int i = my_left; i < my_right; i++ ){ int elem = GetElement(i); wynik += ile_razem - mniejsze(elem); dodaj(elem); ile_razem++; } } void dostan_tablice(){ for( int i = 1000000; i > 0; i-- ) wieksze[i] = (my_right - my_left) - mniejsze(i); //for( int i = 1; i <= 5; i++ ) cout << wieksze[i] << endl; } void licz_dodatkowe(){ for( int i = my_right; i < n; i++ ) wynik += wieksze[GetElement(i)]; } void znajdz_wynik(){ if( my_nr != 0 ){ PutLL(0, wynik); Send(0); } else{ FOR(i, NODES-1){ Receive(i); wynik += GetLL(i); } cout << wynik << endl; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); init(); licz_wlasny(); dostan_tablice(); licz_dodatkowe(); znajdz_wynik(); 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 | #include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; #define REP(i, x) for( int i = 0; i < x; i++ ) #define FOR(i, x) for( int i = 1; i <=x; i++ ) const int MAX_K = 1001000; int n; int my_nr; int NODES; int drzewo[MAX_K]; int wieksze[MAX_K]; int my_left; int my_right; long long wynik = 0; inline int mniejsze(int a){ int res = 0; while( a > 0 ){ res += drzewo[a]; a -= (a&-a); } return res; } inline void dodaj(int a){ while( a < MAX_K ){ drzewo[a]++; a += (a&-a); } } void init(){ n = GetN(); my_nr = MyNodeId(); NODES = NumberOfNodes(); int range = n / NODES + 1; my_left = range * my_nr; my_right = min(range * (my_nr+1), n); } void licz_wlasny(){ int ile_razem = 0; for( int i = my_left; i < my_right; i++ ){ int elem = GetElement(i); wynik += ile_razem - mniejsze(elem); dodaj(elem); ile_razem++; } } void dostan_tablice(){ for( int i = 1000000; i > 0; i-- ) wieksze[i] = (my_right - my_left) - mniejsze(i); //for( int i = 1; i <= 5; i++ ) cout << wieksze[i] << endl; } void licz_dodatkowe(){ for( int i = my_right; i < n; i++ ) wynik += wieksze[GetElement(i)]; } void znajdz_wynik(){ if( my_nr != 0 ){ PutLL(0, wynik); Send(0); } else{ FOR(i, NODES-1){ Receive(i); wynik += GetLL(i); } cout << wynik << endl; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); init(); licz_wlasny(); dostan_tablice(); licz_dodatkowe(); znajdz_wynik(); return 0; } |