#include <bits/stdc++.h>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>
#include "message.h"
#include "teatr.h"
//using namespace __gnu_pbds;
using namespace std;
#define ff first
#define dd second
#define mp make_pair
typedef long long lld;
#define pb emplace_back
#define sz size()
#define For(i,s,a) for(lld i=(lld)s;i<(lld)a;++i)
typedef pair<int,int> pii;
typedef pair<lld,lld> pll;
#define rpt(S,it) for(auto it=S.begin();it!=S.end();++it)
//#define mod (lld)(1e9+7)
#define scanf(...) scanf(__VA_ARGS__)?:0
#define P first
#define S second
#ifdef __WIN32__
#define gcx getchar
#elif __linux__
#define gcx getchar_unlocked
#endif
#define piii pair<pii,pii>
//template<typename T>
#define T lld
inline void scan(T *i)
{
register T t=0;
register char z='a';
register bool neg=0;
while(z<'0' || z>'9'){if(z=='-')neg^=1;
z=gcx();}
while(z>='0' && z<='9')
{
t=(t<<3ll)+(t<<1ll)+z-'0';
z=gcx();
}
if(neg)t=~(t-1);
*i=t;
}
int tree[1048576],c[1048576],ile[1048576];
int p,k;
lld wyn=0;
int maxn=0;
void upd(int x, int val)
{
while(x)tree[x]+=val,x-=(x&(-x));
}
int get(int x)
{
int ret=0;
while(x<1048576)
ret+=tree[x],x+=(x&(-x));
return ret;
}
bool sol(int a, int ktory)
{
p=(1000000)*ktory;
k=(1000000)*(ktory+1);
k=min(k,a);
//cout<<p<<" "<<k<<" "<<ktory<<endl;
if(p>=a){PutLL(0,0);Send(0);return 1;}
For(i,p,k)
c[i-p]=GetElement(i);
For(i,0,k-p){
maxn=max(maxn,c[i]);
upd(c[i],1);
wyn+=get(c[i]+1);
++ile[c[i]];
}
//cout<<wyn<<endl;
for(int i=maxn-1;i;--i)ile[i]+=ile[i+1];
//For(i,0,maxn+1)cout<<i<<" "<<ile[i]<<endl;
For(i,k,a)
wyn+=ile[GetElement(i)+1];
//cout<<wyn<<endl;
return 0;
}
void push(int a, int ktory)
{
PutLL(0,wyn);
Send(0);
//cout<<ktory<<" OK "<<endl;
}
void play(int a, int ktory)
{
//--ktory;
Receive(ktory);
wyn+=GetLL(ktory);
}
int main()
{
int thiss=MyNodeId();
int a=GetN();
if(sol(a,thiss))return 0;
//cout<<wyn<<endl;
if(thiss)
push(a,thiss);
//if(!thiss)For(i,0,maxn+1)cout<<ile[i]<<" "<<i<<endl;
if(!thiss)
For(i,1,NumberOfNodes())
play(a,i);
//if(k==a)
if(!thiss)
printf("%lld",wyn);
return 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <bits/stdc++.h> #include <random> #include <ext/pb_ds/assoc_container.hpp> #include "message.h" #include "teatr.h" //using namespace __gnu_pbds; using namespace std; #define ff first #define dd second #define mp make_pair typedef long long lld; #define pb emplace_back #define sz size() #define For(i,s,a) for(lld i=(lld)s;i<(lld)a;++i) typedef pair<int,int> pii; typedef pair<lld,lld> pll; #define rpt(S,it) for(auto it=S.begin();it!=S.end();++it) //#define mod (lld)(1e9+7) #define scanf(...) scanf(__VA_ARGS__)?:0 #define P first #define S second #ifdef __WIN32__ #define gcx getchar #elif __linux__ #define gcx getchar_unlocked #endif #define piii pair<pii,pii> //template<typename T> #define T lld inline void scan(T *i) { register T t=0; register char z='a'; register bool neg=0; while(z<'0' || z>'9'){if(z=='-')neg^=1; z=gcx();} while(z>='0' && z<='9') { t=(t<<3ll)+(t<<1ll)+z-'0'; z=gcx(); } if(neg)t=~(t-1); *i=t; } int tree[1048576],c[1048576],ile[1048576]; int p,k; lld wyn=0; int maxn=0; void upd(int x, int val) { while(x)tree[x]+=val,x-=(x&(-x)); } int get(int x) { int ret=0; while(x<1048576) ret+=tree[x],x+=(x&(-x)); return ret; } bool sol(int a, int ktory) { p=(1000000)*ktory; k=(1000000)*(ktory+1); k=min(k,a); //cout<<p<<" "<<k<<" "<<ktory<<endl; if(p>=a){PutLL(0,0);Send(0);return 1;} For(i,p,k) c[i-p]=GetElement(i); For(i,0,k-p){ maxn=max(maxn,c[i]); upd(c[i],1); wyn+=get(c[i]+1); ++ile[c[i]]; } //cout<<wyn<<endl; for(int i=maxn-1;i;--i)ile[i]+=ile[i+1]; //For(i,0,maxn+1)cout<<i<<" "<<ile[i]<<endl; For(i,k,a) wyn+=ile[GetElement(i)+1]; //cout<<wyn<<endl; return 0; } void push(int a, int ktory) { PutLL(0,wyn); Send(0); //cout<<ktory<<" OK "<<endl; } void play(int a, int ktory) { //--ktory; Receive(ktory); wyn+=GetLL(ktory); } int main() { int thiss=MyNodeId(); int a=GetN(); if(sol(a,thiss))return 0; //cout<<wyn<<endl; if(thiss) push(a,thiss); //if(!thiss)For(i,0,maxn+1)cout<<ile[i]<<" "<<i<<endl; if(!thiss) For(i,1,NumberOfNodes()) play(a,i); //if(k==a) if(!thiss) printf("%lld",wyn); return 0; } |
English