#include <bits/stdc++.h> #include "krazki.h" #include "message.h" using namespace std; using ll=long long; const ll INF=2e18; ll n, m; inline ll MyHoleDiameter(int i) //zle przeczytalem tresc :P { return HoleDiameter(n-i+1); } int result(int pipe_l, int pipe_r, int disc_l, int disc_r) { if(pipe_r==pipe_l||disc_r==disc_l) return 0; vector<ll> discs(disc_r-disc_l), holes(pipe_r-pipe_l); for(int i=0; i<disc_r-disc_l; ++i) discs[i]=DiscDiameter(i+1+disc_l); for(int i=0; i<pipe_r-pipe_l; ++i) holes[i]=MyHoleDiameter(i+1+pipe_l); for(int i=1; i<disc_l-disc_r; ++i) discs[i]=max(discs[i], discs[i-1]); for(int i=pipe_r-pipe_l-2; i>=0; --i) holes[i]=min(holes[i], holes[i+1]); int j=0, res=0; for(int i=0; i<discs.size(); ++i) { while(j<holes.size()&&holes[j]<discs[i]) ++j; if(j>0) res=max(res, pipe_l-disc_l+j-i); } /* if(res>0) { printf("Instance %d here!\n", MyNodeId()); if(1) { printf("[%d, %d), [%d, %d)\n", pipe_l, pipe_r, disc_l, disc_r); printf("Content:\n"); for(ll i: holes) printf("%lld ", i); printf("\n"); for(ll i: discs) printf("%lld ", i); printf("\n"); } } */ return res; } int main() { n=PipeHeight(), m=NumberOfDiscs(); //if(MyNodeId()==0) printf("Hello World!\n"); int nodes=NumberOfNodes(), id=MyNodeId(); nodes=min(nodes, (int)min(n, m)); if(id>=nodes) return 0; //jestes bezuzyteczna ll pipe_mn=INF, disc_mx=0; for(int i=id*n/nodes+1; i<(id+1)*n/nodes+1; ++i) pipe_mn=min(pipe_mn, MyHoleDiameter(i)); for(int i=id*m/nodes+1; i<(id+1)*m/nodes+1; ++i) disc_mx=max(disc_mx, DiscDiameter(i)); PutLL(0, pipe_mn); PutLL(0, disc_mx); Send(0); if(id==0) { vector<ll> holes(nodes), discs(nodes); for(int i=0; i<nodes; ++i) { Receive(i); holes[i]=GetLL(i); discs[i]=GetLL(i); } for(int i=1; i<nodes; ++i) discs[i]=max(discs[i], discs[i-1]); for(int i=nodes-2; i>=0; --i) holes[i]=min(holes[i], holes[i+1]); /* for(ll i: holes) printf("%lld ", i); printf("\n"); for(ll i: discs) printf("%lld ", i); printf("\n"); */ int i1=0, i2=0; while(i1<nodes&&i2<nodes) { PutInt((i1+i2)/2, i1); PutInt((i1+i2)/2, i2); if(i2==nodes-1||(i1<nodes-1&&holes[i1+1]<discs[i2+1])) ++i1; else ++i2; } for(int i=0; i<nodes; ++i) Send(i); } Receive(0); int mx=0; for(int whatever=0; whatever<2; ++whatever) { int i1=GetInt(0); int i2=GetInt(0); mx=max(mx, result(i1*n/nodes, (i1+1)*n/nodes, i2*m/nodes, (i2+1)*m/nodes)); if(id==nodes-1) break; } PutInt(0, mx); Send(0); if(id==0) { for(int i=0; i<nodes; ++i) { Receive(i); mx=max(mx, GetInt(i)); } int res=max(n-m-mx+1, 0LL); printf("%d\n", res); } }
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 | #include <bits/stdc++.h> #include "krazki.h" #include "message.h" using namespace std; using ll=long long; const ll INF=2e18; ll n, m; inline ll MyHoleDiameter(int i) //zle przeczytalem tresc :P { return HoleDiameter(n-i+1); } int result(int pipe_l, int pipe_r, int disc_l, int disc_r) { if(pipe_r==pipe_l||disc_r==disc_l) return 0; vector<ll> discs(disc_r-disc_l), holes(pipe_r-pipe_l); for(int i=0; i<disc_r-disc_l; ++i) discs[i]=DiscDiameter(i+1+disc_l); for(int i=0; i<pipe_r-pipe_l; ++i) holes[i]=MyHoleDiameter(i+1+pipe_l); for(int i=1; i<disc_l-disc_r; ++i) discs[i]=max(discs[i], discs[i-1]); for(int i=pipe_r-pipe_l-2; i>=0; --i) holes[i]=min(holes[i], holes[i+1]); int j=0, res=0; for(int i=0; i<discs.size(); ++i) { while(j<holes.size()&&holes[j]<discs[i]) ++j; if(j>0) res=max(res, pipe_l-disc_l+j-i); } /* if(res>0) { printf("Instance %d here!\n", MyNodeId()); if(1) { printf("[%d, %d), [%d, %d)\n", pipe_l, pipe_r, disc_l, disc_r); printf("Content:\n"); for(ll i: holes) printf("%lld ", i); printf("\n"); for(ll i: discs) printf("%lld ", i); printf("\n"); } } */ return res; } int main() { n=PipeHeight(), m=NumberOfDiscs(); //if(MyNodeId()==0) printf("Hello World!\n"); int nodes=NumberOfNodes(), id=MyNodeId(); nodes=min(nodes, (int)min(n, m)); if(id>=nodes) return 0; //jestes bezuzyteczna ll pipe_mn=INF, disc_mx=0; for(int i=id*n/nodes+1; i<(id+1)*n/nodes+1; ++i) pipe_mn=min(pipe_mn, MyHoleDiameter(i)); for(int i=id*m/nodes+1; i<(id+1)*m/nodes+1; ++i) disc_mx=max(disc_mx, DiscDiameter(i)); PutLL(0, pipe_mn); PutLL(0, disc_mx); Send(0); if(id==0) { vector<ll> holes(nodes), discs(nodes); for(int i=0; i<nodes; ++i) { Receive(i); holes[i]=GetLL(i); discs[i]=GetLL(i); } for(int i=1; i<nodes; ++i) discs[i]=max(discs[i], discs[i-1]); for(int i=nodes-2; i>=0; --i) holes[i]=min(holes[i], holes[i+1]); /* for(ll i: holes) printf("%lld ", i); printf("\n"); for(ll i: discs) printf("%lld ", i); printf("\n"); */ int i1=0, i2=0; while(i1<nodes&&i2<nodes) { PutInt((i1+i2)/2, i1); PutInt((i1+i2)/2, i2); if(i2==nodes-1||(i1<nodes-1&&holes[i1+1]<discs[i2+1])) ++i1; else ++i2; } for(int i=0; i<nodes; ++i) Send(i); } Receive(0); int mx=0; for(int whatever=0; whatever<2; ++whatever) { int i1=GetInt(0); int i2=GetInt(0); mx=max(mx, result(i1*n/nodes, (i1+1)*n/nodes, i2*m/nodes, (i2+1)*m/nodes)); if(id==nodes-1) break; } PutInt(0, mx); Send(0); if(id==0) { for(int i=0; i<nodes; ++i) { Receive(i); mx=max(mx, GetInt(i)); } int res=max(n-m-mx+1, 0LL); printf("%d\n", res); } } |