#include<bits/stdc++.h>
#include "krazki.h"
#include "message.h"
using namespace std;
vector<pair <long long, int> > pipe;
vector<long long> kraz;
int main(){
int hei=PipeHeight();
int NOD=NumberOfDiscs();
int non=NumberOfNodes(); //if(NumberOfNodes()!=100)printf("%d\n", 1/0);
int pnon=sqrt(non);
int jamjest=MyNodeId();
if(jamjest<pnon*pnon){
int hp=min(((1LL*jamjest/pnon)*1LL*hei+pnon-1)/pnon +1, 1LL*hei+1), hk=min(((1LL*jamjest/pnon+1)*1LL*hei+pnon-1)/pnon +1 , 1LL*hei+1);
int dp=min(((1LL*jamjest%pnon)*1LL*NOD+pnon-1)/pnon +1, 1LL*NOD+1), dk=min(((1LL*jamjest%pnon+1)*1LL*NOD+pnon-1)/pnon +1 , 1LL*NOD+1);
pipe.push_back(make_pair(0, hei+1));
for(int i=hk-1;i>=hp;--i){
long long newhole=HoleDiameter(i);
while(pipe[pipe.size()-1].first>=newhole)pipe.pop_back();
pipe.push_back(make_pair(newhole, i));
}
for(int i=dp;i<dk;++i){
kraz.push_back(DiscDiameter(i));
}
//sort(pipe.begin(), pipe.end());
int ah=hei+1;
for(int i=0;i<kraz.size();++i){
int a=0;int b=pipe.size();
while(a+1<b){
int s=a+b;
s/=2;
if(kraz[i]>pipe[s].first)a=s;
else b=s;
}
if(pipe.size()!=0)ah=min(ah-1, pipe[a].second-1);
}
int hod=1000000000;
if(jamjest%pnon!=0){
Receive(jamjest-1);
hod=GetInt(jamjest-1);
}
int cand=hod-kraz.size();
ah=min(ah, cand);
if(jamjest%pnon==pnon-1 && jamjest!=pnon*pnon-1){
Receive(jamjest+pnon);
hod=GetInt(jamjest+pnon);
ah=min(ah, hod);
}
if(jamjest%pnon!=pnon-1){
PutInt(jamjest+1,ah);
Send(jamjest+1);
}
else if(jamjest!=pnon-1){
PutInt(jamjest-pnon,ah);
Send(jamjest-pnon);
}
else{
if(ah<0)ah=0;
printf("%d\n", ah);
}
}
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 | #include<bits/stdc++.h> #include "krazki.h" #include "message.h" using namespace std; vector<pair <long long, int> > pipe; vector<long long> kraz; int main(){ int hei=PipeHeight(); int NOD=NumberOfDiscs(); int non=NumberOfNodes(); //if(NumberOfNodes()!=100)printf("%d\n", 1/0); int pnon=sqrt(non); int jamjest=MyNodeId(); if(jamjest<pnon*pnon){ int hp=min(((1LL*jamjest/pnon)*1LL*hei+pnon-1)/pnon +1, 1LL*hei+1), hk=min(((1LL*jamjest/pnon+1)*1LL*hei+pnon-1)/pnon +1 , 1LL*hei+1); int dp=min(((1LL*jamjest%pnon)*1LL*NOD+pnon-1)/pnon +1, 1LL*NOD+1), dk=min(((1LL*jamjest%pnon+1)*1LL*NOD+pnon-1)/pnon +1 , 1LL*NOD+1); pipe.push_back(make_pair(0, hei+1)); for(int i=hk-1;i>=hp;--i){ long long newhole=HoleDiameter(i); while(pipe[pipe.size()-1].first>=newhole)pipe.pop_back(); pipe.push_back(make_pair(newhole, i)); } for(int i=dp;i<dk;++i){ kraz.push_back(DiscDiameter(i)); } //sort(pipe.begin(), pipe.end()); int ah=hei+1; for(int i=0;i<kraz.size();++i){ int a=0;int b=pipe.size(); while(a+1<b){ int s=a+b; s/=2; if(kraz[i]>pipe[s].first)a=s; else b=s; } if(pipe.size()!=0)ah=min(ah-1, pipe[a].second-1); } int hod=1000000000; if(jamjest%pnon!=0){ Receive(jamjest-1); hod=GetInt(jamjest-1); } int cand=hod-kraz.size(); ah=min(ah, cand); if(jamjest%pnon==pnon-1 && jamjest!=pnon*pnon-1){ Receive(jamjest+pnon); hod=GetInt(jamjest+pnon); ah=min(ah, hod); } if(jamjest%pnon!=pnon-1){ PutInt(jamjest+1,ah); Send(jamjest+1); } else if(jamjest!=pnon-1){ PutInt(jamjest-pnon,ah); Send(jamjest-pnon); } else{ if(ah<0)ah=0; printf("%d\n", ah); } } return 0; } |
English