Submission #685757

#TimeUsernameProblemLanguageResultExecution timeMemory
685757jamezzzFlight to the Ford (BOI22_communication)C++17
0 / 100
128 ms118784 KiB
#include "communication.h" #include <bits/stdc++.h> using namespace std; // // --- Sample implementation for the task communication --- // // To compile this program with the sample grader, place: // communication.h communication_sample.cpp sample_grader.cpp // in a single folder, then open the terminal in this directory (right-click onto an empty spot in the directory, // left click on "Open in terminal") and enter e.g.: // g++ -std=c++17 communication_sample.cpp sample_grader.cpp // in this folder. This will create a file a.out in the current directory which you can execute from the terminal // as ./a.out // See task statement or sample_grader.cpp for the input specification // typedef pair<int,int> ii; typedef vector<ii> vii; #define pb push_back #define sz(x) (int)x.size() int getSize(vii &v){ int sum=0; for(auto[a,b]:v)sum+=b-a+1; return sum; } int inside(vii &v,int X){ int half=getSize(v)/2; for(int i=0;i<sz(v);++i){ if(half==0)break; auto[l,r]=v[i]; if(r-l+1<=half){ if(l<=X&&X<=r)return 1; half-=r-l+1; } else{ if(l<=X&&X<=l+half-1)return 1; half=0; } } return 0; } void split(vii &v,vii &vi,vii &ve){ int half=getSize(v)/2; for(int i=0;i<sz(v);++i){ auto[l,r]=v[i]; if(r-l+1<=half)vi.pb({l,r}); else if(half==0)ve.pb({l,r}); else vi.pb({l,l+half-1}),ve.pb({l+half,r}); } } void encode(int N,int X){ vii corr,wrong; corr.pb({1,N}); while(sz(corr)+sz(wrong)>3){ int res=send(inside(corr,X)||inside(wrong,X)); vector<ii> corrI,corrE,wrongI,wrongE; split(corr,corrI,corrE); split(wrong,wrongI,wrongE); corr.clear(); wrong.clear(); if(res==1){ for(ii x:corrI)corr.pb(x); for(ii x:wrongI)corr.pb(x); for(ii x:corrE)wrong.pb(x); } else{ for(ii x:corrE)corr.pb(x); for(ii x:wrongE)corr.pb(x); for(ii x:corrI)wrong.pb(x); } } vector<int> rem; for(auto [l,r]:corr){ for(int i=l;i<=r;++i)rem.pb(i); } for(auto [l,r]:wrong){ for(int i=l;i<=r;++i)rem.pb(i); } if(X==rem[0])send(0),send(0),send(0),send(0); if(X==rem[1])send(1),send(1),send(0),send(0); if(X==rem[2])send(1),send(1),send(1),send(1); } ii decode(int N){ vii corr,wrong; corr.pb({1,N}); while(sz(corr)+sz(wrong)>3){ int res=receive(); vector<ii> corrI,corrE,wrongI,wrongE; split(corr,corrI,corrE); split(wrong,wrongI,wrongE); corr.clear(); wrong.clear(); if(res==1){ for(ii x:corrI)corr.pb(x); for(ii x:wrongI)corr.pb(x); for(ii x:corrE)wrong.pb(x); } else{ for(ii x:corrE)corr.pb(x); for(ii x:wrongE)corr.pb(x); for(ii x:corrI)wrong.pb(x); } } vector<int> rem; for(auto [l,r]:corr){ for(int i=l;i<=r;++i)rem.pb(i); } for(auto [l,r]:wrong){ for(int i=l;i<=r;++i)rem.pb(i); } int tot=0; for(int i=0;i<4;++i)tot+=receive(); if(tot<=2)return {rem[0],rem[1]}; else return {rem[1],rem[2]}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...