#include "message.h" #include "teatr.h" #include "bits/stdc++.h" using namespace std; long long wynik,a,zlicz[6],aktzlicz,baza=1024*1024; int drzewo[2500005]; void sprawdz(int a,int b,int lo,int hi,int v) { if(a>hi||b<lo)return; if(a<=lo&&b>=hi) { wynik+=drzewo[v]; return; } sprawdz(a,b,lo,(lo+hi)/2,2*v); sprawdz(a,b,(lo+hi)/2+1,hi,2*v+1); } void push(int x) { x+=baza; while(x) { drzewo[x]++; x/=2; } } int main() { int n = GetN(); if(n<=100000) { if(MyNodeId() != 0) return 0; for(int i=0;i<n;i++) { a=GetElement(i); sprawdz(baza+a+1,2*baza-1,baza,2*baza-1,1); push(a); } } else { for(int i=(max(1,(n/NumberOfNodes())))*MyNodeId();i<min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } if(MyNodeId()==NumberOfNodes()-1) { for(int i=min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i<n;i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } } for(int i=NumberOfNodes()-1;i>0;i--) { if(MyNodeId()==i) { PutLL(i-1,wynik); PutLL(i-1,zlicz[1]); PutLL(i-1,zlicz[2]); PutLL(i-1,zlicz[3]); PutLL(i-1,zlicz[4]); PutLL(i-1,zlicz[5]); Send(i-1); } if(MyNodeId()==i-1) { Receive(i); wynik+=GetLL(i); aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[2]+zlicz[3]+zlicz[4]+zlicz[5]); zlicz[1]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[3]+zlicz[4]+zlicz[5]); zlicz[2]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[4]+zlicz[5]); zlicz[3]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[5]); zlicz[4]+=aktzlicz; aktzlicz=GetLL(i); zlicz[5]+=aktzlicz; } } } if(MyNodeId() == 0) 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 91 | #include "message.h" #include "teatr.h" #include "bits/stdc++.h" using namespace std; long long wynik,a,zlicz[6],aktzlicz,baza=1024*1024; int drzewo[2500005]; void sprawdz(int a,int b,int lo,int hi,int v) { if(a>hi||b<lo)return; if(a<=lo&&b>=hi) { wynik+=drzewo[v]; return; } sprawdz(a,b,lo,(lo+hi)/2,2*v); sprawdz(a,b,(lo+hi)/2+1,hi,2*v+1); } void push(int x) { x+=baza; while(x) { drzewo[x]++; x/=2; } } int main() { int n = GetN(); if(n<=100000) { if(MyNodeId() != 0) return 0; for(int i=0;i<n;i++) { a=GetElement(i); sprawdz(baza+a+1,2*baza-1,baza,2*baza-1,1); push(a); } } else { for(int i=(max(1,(n/NumberOfNodes())))*MyNodeId();i<min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } if(MyNodeId()==NumberOfNodes()-1) { for(int i=min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i<n;i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } } for(int i=NumberOfNodes()-1;i>0;i--) { if(MyNodeId()==i) { PutLL(i-1,wynik); PutLL(i-1,zlicz[1]); PutLL(i-1,zlicz[2]); PutLL(i-1,zlicz[3]); PutLL(i-1,zlicz[4]); PutLL(i-1,zlicz[5]); Send(i-1); } if(MyNodeId()==i-1) { Receive(i); wynik+=GetLL(i); aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[2]+zlicz[3]+zlicz[4]+zlicz[5]); zlicz[1]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[3]+zlicz[4]+zlicz[5]); zlicz[2]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[4]+zlicz[5]); zlicz[3]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[5]); zlicz[4]+=aktzlicz; aktzlicz=GetLL(i); zlicz[5]+=aktzlicz; } } } if(MyNodeId() == 0) cout << wynik; } |