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