#include "message.h" #include "teatr.h" #include <bits/stdc++.h> using namespace std; int main(){ int N = GetN(); long long T[1000005]; for(int i=0; i<=1000000; i++) T[i] = 0; int maxi = 0; long long res = 0; long long be = (MyNodeId() * (long long)N) / (long long)NumberOfNodes(); long long en = ((MyNodeId() + 1) * (long long)N) / (long long)NumberOfNodes(); for(int i=be; i<en; i++){ int a = GetElement(i); for(int j=maxi; j>a; j--) res += T[j]; maxi = max(maxi, a); T[a]++; } if(MyNodeId() > 0){ PutLL(0, res); PutInt(0, maxi); for(int i=1; i<=maxi; i++){ PutLL(0, T[i]); } Send(0); } else { for(int i=1; i<NumberOfNodes(); i++){ // printf("%d:\n", i); // for(int i=1; i<=maxi; i++){ // printf("%lld ", T[i]); // }printf("\n"); // printf("%lld\n", res); // printf("%d\n", maxi); Receive(i); long long tmpRes = GetLL(i); res += tmpRes; int tmpMaxi = GetInt(i); for(int j=1; j<=tmpMaxi; j++){ long long t = GetLL(i); for(int k=j+1; k<=maxi; k++) res += T[k]*t; T[j] += t; } maxi = max(maxi, tmpMaxi); } // for(int i=1; i<=maxi; i++){ // printf("%lld ", T[i]); // }printf("\n"); printf("%lld\n", res); } }
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 | #include "message.h" #include "teatr.h" #include <bits/stdc++.h> using namespace std; int main(){ int N = GetN(); long long T[1000005]; for(int i=0; i<=1000000; i++) T[i] = 0; int maxi = 0; long long res = 0; long long be = (MyNodeId() * (long long)N) / (long long)NumberOfNodes(); long long en = ((MyNodeId() + 1) * (long long)N) / (long long)NumberOfNodes(); for(int i=be; i<en; i++){ int a = GetElement(i); for(int j=maxi; j>a; j--) res += T[j]; maxi = max(maxi, a); T[a]++; } if(MyNodeId() > 0){ PutLL(0, res); PutInt(0, maxi); for(int i=1; i<=maxi; i++){ PutLL(0, T[i]); } Send(0); } else { for(int i=1; i<NumberOfNodes(); i++){ // printf("%d:\n", i); // for(int i=1; i<=maxi; i++){ // printf("%lld ", T[i]); // }printf("\n"); // printf("%lld\n", res); // printf("%d\n", maxi); Receive(i); long long tmpRes = GetLL(i); res += tmpRes; int tmpMaxi = GetInt(i); for(int j=1; j<=tmpMaxi; j++){ long long t = GetLL(i); for(int k=j+1; k<=maxi; k++) res += T[k]*t; T[j] += t; } maxi = max(maxi, tmpMaxi); } // for(int i=1; i<=maxi; i++){ // printf("%lld ", T[i]); // }printf("\n"); printf("%lld\n", res); } } |