#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; } |
English