#include "teatr.h" #include "message.h" #include <bits/stdc++.h> #define f first #define s second #define LL long long #define ALL(V) V.begin(),V.end() #define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl "\n" #define debug(x) cerr<<#x<<": "<<x<<endl using namespace std; const LL N=1e6+69, base=1024*1024,mod=1e9+7; int tree[base*2+69]; // int GetN() { return int(1e8); } // int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } void insert(int v) { v+=base; while(v>1) { tree[v]++; v/=2; } } int query(int v) { v+=base; int re=tree[v]; while(v>1) { if(v%2==0) re+=tree[v+1]; v/=2; } return re; } long long countInversions(vector <pair<int,int>> vek) { long long re=0; sort(ALL(vek)); if(vek.size()==1) { pair<int,int> u=vek[0]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); re+=query(a+1); insert(a); } } else if(vek.size()==2) { pair<int,int> u=vek[0]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); insert(a); } u=vek[1]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); re+=query(a+1); } } return re; } pair<int,int> getInter(long long nr) { long long a=nr*GetN(); a/=10; long long b=(nr+1)*GetN(); b=b/10-1; return {a,b}; } vector<pair<int,int>> getIntevals(int nr) { vector <pair<int,int>> re; int zm1=nr%10; re.push_back(getInter(nr%10)); nr/=10; int zm2=nr%10; if(zm1<zm2) { re.clear(); return re; } re.push_back(getInter(nr%10)); if(re[0]==re[1]) re.pop_back(); return re; } int32_t main(void) { if(GetN()<1000) { if(MyNodeId()!=0) return 0; vector <pair<int,int>> V; V.push_back({0,GetN()-1}); cout<<countInversions(V)<<endl; return 0; } if(MyNodeId()==0) { long long wynik=countInversions(getIntevals(MyNodeId())); for(int i=1;i<=99;i++) { Receive(i); long long re=GetLL(i); wynik+=re; } cout<<wynik<<endl; } else { long long re=countInversions(getIntevals(MyNodeId())); PutLL(0, re); Send(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 91 92 93 94 95 96 97 98 99 100 | #include "teatr.h" #include "message.h" #include <bits/stdc++.h> #define f first #define s second #define LL long long #define ALL(V) V.begin(),V.end() #define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl "\n" #define debug(x) cerr<<#x<<": "<<x<<endl using namespace std; const LL N=1e6+69, base=1024*1024,mod=1e9+7; int tree[base*2+69]; // int GetN() { return int(1e8); } // int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } void insert(int v) { v+=base; while(v>1) { tree[v]++; v/=2; } } int query(int v) { v+=base; int re=tree[v]; while(v>1) { if(v%2==0) re+=tree[v+1]; v/=2; } return re; } long long countInversions(vector <pair<int,int>> vek) { long long re=0; sort(ALL(vek)); if(vek.size()==1) { pair<int,int> u=vek[0]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); re+=query(a+1); insert(a); } } else if(vek.size()==2) { pair<int,int> u=vek[0]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); insert(a); } u=vek[1]; for(int i=u.f;i<=u.s;i++) { int a = GetElement(i); re+=query(a+1); } } return re; } pair<int,int> getInter(long long nr) { long long a=nr*GetN(); a/=10; long long b=(nr+1)*GetN(); b=b/10-1; return {a,b}; } vector<pair<int,int>> getIntevals(int nr) { vector <pair<int,int>> re; int zm1=nr%10; re.push_back(getInter(nr%10)); nr/=10; int zm2=nr%10; if(zm1<zm2) { re.clear(); return re; } re.push_back(getInter(nr%10)); if(re[0]==re[1]) re.pop_back(); return re; } int32_t main(void) { if(GetN()<1000) { if(MyNodeId()!=0) return 0; vector <pair<int,int>> V; V.push_back({0,GetN()-1}); cout<<countInversions(V)<<endl; return 0; } if(MyNodeId()==0) { long long wynik=countInversions(getIntevals(MyNodeId())); for(int i=1;i<=99;i++) { Receive(i); long long re=GetLL(i); wynik+=re; } cout<<wynik<<endl; } else { long long re=countInversions(getIntevals(MyNodeId())); PutLL(0, re); Send(0); } } |