#include"teatr.h" #include"message.h" #include<iostream> #include<vector> using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector< ii > vii; typedef vector< pair < ii, int > > viii; typedef vector< vector < ii > > vvii; typedef pair < pair < int, int >, int > iii; typedef pair < pair < int, int >, pair < int, int > > iiii; typedef unsigned long long ull; typedef long long ll; typedef unsigned long long ull; typedef vector< ll > vll; typedef long double ld; #define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define sz(a) int((a).size()) #define pb push_back #define all(c) (c).begin(), (c).end() #define st first #define nd second #define rep(i,n) for(int i=0; i<(n); ++i) #define rall(c) (c).rbegin(), (c).rend() #define FOR(i, a, b) for (int (i)=(a); (i)<(b); (i)++) #define FOR2(i, a, b) for (int (i)=(a); (i)>=(b); (i)--) template<typename T> inline void setmin(T &x, T y) { if (y < x) x = y; } template<typename T> inline void setmax(T &x, T y) { if (y > x) x = y; } template<typename T> inline T gcd(T a, T b) { while (b)swap(a %= b, b); return a; } const int MAX = 1e6 + 7; const int T = 1 << 20; const int INF = 1e9 + 7; const ll BIG_INF = 1e18 + 5; ld e = 2.7182818284590452353602874713526624; //ld PI = acos(-1); ld eps = 1e-19; int tree[ T << 1 ]; void udpate( int poz ){ poz += T; while( poz ){ ++tree[poz]; poz >>= 1; } } int ask( int pocz , int kon ){ pocz += T , kon += T; int ret = tree[ pocz ] + tree[kon]; while( pocz >> 1 != kon >> 1 ){ if( !(pocz & 1) ) ret += tree[pocz + 1]; if( kon & 1 ) ret += tree[kon - 1]; pocz >>= 1; kon >>= 1; } return ret; } int main(){ boost; ll wynik = 0; int n = GetN(); for( int i = 0 ; i < min( MyNodeId() * 1000000 , n ) ; ++i ){ ++tree[ T + GetElement(i) ]; } for( int i = T - 1 ; i > 0 ; --i ){ tree[i] = tree[i*2] + tree[ i*2 + 1 ]; } for( int i = MyNodeId() * 1000000 ; i < min( n , ( MyNodeId() + 1 ) * 1000000 ) ; ++i ){ int w = GetElement(i); wynik += ask( w + 1 , MAX ); udpate( w ); } if( MyNodeId() > 0 ){ PutLL(0,wynik); Send(0); } else{ for( int i = 1 ; i < NumberOfNodes() ; i++ ){ Receive(i); wynik += GetLL(i); } cout << wynik << endl; } }
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 92 93 94 95 96 97 98 99 | #include"teatr.h" #include"message.h" #include<iostream> #include<vector> using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector< ii > vii; typedef vector< pair < ii, int > > viii; typedef vector< vector < ii > > vvii; typedef pair < pair < int, int >, int > iii; typedef pair < pair < int, int >, pair < int, int > > iiii; typedef unsigned long long ull; typedef long long ll; typedef unsigned long long ull; typedef vector< ll > vll; typedef long double ld; #define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define sz(a) int((a).size()) #define pb push_back #define all(c) (c).begin(), (c).end() #define st first #define nd second #define rep(i,n) for(int i=0; i<(n); ++i) #define rall(c) (c).rbegin(), (c).rend() #define FOR(i, a, b) for (int (i)=(a); (i)<(b); (i)++) #define FOR2(i, a, b) for (int (i)=(a); (i)>=(b); (i)--) template<typename T> inline void setmin(T &x, T y) { if (y < x) x = y; } template<typename T> inline void setmax(T &x, T y) { if (y > x) x = y; } template<typename T> inline T gcd(T a, T b) { while (b)swap(a %= b, b); return a; } const int MAX = 1e6 + 7; const int T = 1 << 20; const int INF = 1e9 + 7; const ll BIG_INF = 1e18 + 5; ld e = 2.7182818284590452353602874713526624; //ld PI = acos(-1); ld eps = 1e-19; int tree[ T << 1 ]; void udpate( int poz ){ poz += T; while( poz ){ ++tree[poz]; poz >>= 1; } } int ask( int pocz , int kon ){ pocz += T , kon += T; int ret = tree[ pocz ] + tree[kon]; while( pocz >> 1 != kon >> 1 ){ if( !(pocz & 1) ) ret += tree[pocz + 1]; if( kon & 1 ) ret += tree[kon - 1]; pocz >>= 1; kon >>= 1; } return ret; } int main(){ boost; ll wynik = 0; int n = GetN(); for( int i = 0 ; i < min( MyNodeId() * 1000000 , n ) ; ++i ){ ++tree[ T + GetElement(i) ]; } for( int i = T - 1 ; i > 0 ; --i ){ tree[i] = tree[i*2] + tree[ i*2 + 1 ]; } for( int i = MyNodeId() * 1000000 ; i < min( n , ( MyNodeId() + 1 ) * 1000000 ) ; ++i ){ int w = GetElement(i); wynik += ask( w + 1 , MAX ); udpate( w ); } if( MyNodeId() > 0 ){ PutLL(0,wynik); Send(0); } else{ for( int i = 1 ; i < NumberOfNodes() ; i++ ){ Receive(i); wynik += GetLL(i); } cout << wynik << endl; } } |