Submission #672350

#TimeUsernameProblemLanguageResultExecution timeMemory
672350alvingogoFlight to the Ford (BOI22_communication)C++17
100 / 100
7602 ms4808 KiB
#include <bits/stdc++.h> #include "communication.h" using namespace std; vector<int> use(vector<int> &a,vector<int> &b,int x,int t){ sort(a.begin(),a.end()); sort(b.begin(),b.end()); int as=a.size(); int bs=b.size(); if(t==0 && as+bs<=18){ vector<int> z; for(auto h:a){ z.push_back(h); } for(auto h:b){ z.push_back(h); } return z; } vector<int> la,ra,lb,rb; if(as+bs<=2){ vector<int> z; for(auto h:a){ z.push_back(h); } for(auto h:b){ z.push_back(h); } if(z.size()==1){ int u=z[0]; z.push_back(u); } return z; } else if(as==2 && bs==1){ vector<int> g; for(auto h:a){ g.push_back(h); } for(auto h:b){ g.push_back(h); } if(g[0]>g[1]){ swap(g[0],g[1]); } //sort(g.begin(),g.end()); int u=-1; for(int i=0;i<3;i++){ if(g[i]==x){ u=i; } } if(t==0){ return g; } else{ string s[3]={"00","01","11"}; if(u==-1){ string z; for(int j=0;j<2;j++){ z+=char('0'+receive()); } int flag=-1; for(int i=0;i<3;i++){ int lst=0; if(i==2){ lst=1; } for(int j=0;j<2;j++){ if(s[i][j]!=z[j]){ if(lst){ flag=i; break; } else{ lst=1; } } else{ lst=0; } } } vector<int> ret; for(int i=0;i<3;i++){ if(i!=flag){ ret.push_back(g[i]); } } return ret; } else{ for(int i=0;i<2;i++){ send(int(s[u][i]-'0')); } return vector<int>(); } } } int nxt=-1; for(int i=0;i<as/2;i++){ if(a[i]==x){ nxt=0; } } for(int i=as/2;i<as;i++){ if(a[i]==x){ nxt=1; } } for(int i=0;i<(bs+1)/2;i++){ if(b[i]==x){ nxt=0; } } for(int i=(bs+1)/2;i<bs;i++){ if(b[i]==x){ nxt=1; } } int dd; if(nxt==-1){ dd=receive(); } else{ dd=send(nxt); } if(dd==0){ for(int i=0;i<as/2;i++){ la.push_back(a[i]); } for(int i=as/2;i<as;i++){ lb.push_back(a[i]); } for(int i=0;i<(bs+1)/2;i++){ la.push_back(b[i]); } return use(la,lb,x,t); } else{ for(int i=0;i<as/2;i++){ rb.push_back(a[i]); } for(int i=as/2;i<as;i++){ ra.push_back(a[i]); } for(int i=(bs+1)/2;i<bs;i++){ ra.push_back(b[i]); } return use(ra,rb,x,t); } } const int Bd=1000; vector<int> emp; vector<int> solve(int N,int X){ X--; int a=-1,b=-1,c=-1; if(X>=0){ a=X/(Bd*Bd); int dd=X%(Bd*Bd); b=dd/Bd; c=dd%Bd; } vector<int> v(Bd),w(Bd),k(Bd); iota(v.begin(),v.end(),0); iota(w.begin(),w.end(),0); iota(k.begin(),k.end(),0); auto e=use(v,emp,a,0); auto f=use(w,emp,b,0); auto g=use(k,emp,c,0); vector<int> z; for(auto h:e){ for(auto y:f){ for(auto t:g){ int cnt=h*Bd*Bd+y*Bd+t; if(cnt<0 || cnt>=N){ continue; } z.push_back(cnt); } } } sort(z.begin(),z.end()); return use(z,emp,X,1); } void encode(int N,int X){ solve(N,X); } pair<int,int> decode(int N){ auto h=solve(N,-1); int x=h.size(); return {h[0]+1,h[min(x-1,1)]+1}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...