Submission #823996

#TimeUsernameProblemLanguageResultExecution timeMemory
823996ttamxFlight to the Ford (BOI22_communication)C++17
74 / 100
2726 ms2164 KiB
#include"communication.h" #include<bits/stdc++.h> using namespace std; typedef pair<int,int> p2; void encode(int N, int X){ vector<int> val={0,6,9,15}; vector<int> bit; vector<vector<int>> vec(16); for(int i=0;i<16;i++){ bool ok=true; for(int j=0;j<3;j++)ok&=(i>>j&3)!=3; if(ok)bit.emplace_back(i); } for(int i=0;i<4;i++)for(auto x:bit)vec[val[i]^x].emplace_back(i); auto give=[&](int x){ int num=0; for(int i=0;i<4;i++)num|=send(val[x]>>i&1)<<i; return vec[num]; }; function<void(vector<p2>)> sol=[&](vector<p2> itv){ int sz=0; for(auto [l,r]:itv)sz+=r-l+1; if(sz<=2)return; sz=(sz+3)/4; int cnt=0,cur=0; vector<vector<p2>> block(4); for(auto [l,r]:itv){ block[cur].emplace_back(l,r); cnt+=r-l+1; while(cnt>=sz){ int dif=cnt-sz; block[cur].back().second-=dif; cur++; if(dif>0)block[cur].emplace_back(r-dif+1,r); cnt=dif; } } int id=0; for(int i=0;i<4;i++)for(auto [l,r]:block[i])if(l<=X&&X<=r)id=i; auto tmp=give(id); vector<p2> res=block[tmp[0]]; for(auto x:block[tmp[1]])res.emplace_back(x); sol(res); }; sol({{1,N}}); } pair<int, int> decode(int N) { vector<int> val={0,6,9,15}; vector<int> bit; vector<vector<int>> vec(16); for(int i=0;i<16;i++){ bool ok=true; for(int j=0;j<3;j++)ok&=(i>>j&3)!=3; if(ok)bit.emplace_back(i); } for(int i=0;i<4;i++)for(auto x:bit)vec[val[i]^x].emplace_back(i); auto get=[&](){ int num=0; for(int i=0;i<4;i++)num|=receive()<<i; return vec[num]; }; vector<int> ans; function<void(vector<p2>)> sol=[&](vector<p2> itv){ int sz=0; for(auto [l,r]:itv)sz+=r-l+1; if(sz<=2){ for(auto [l,r]:itv)for(int i=l;i<=r;i++)ans.emplace_back(i); while(ans.size()<2)ans.emplace_back(1); return; } sz=(sz+3)/4; int cnt=0,cur=0; vector<vector<p2>> block(4); for(auto [l,r]:itv){ block[cur].emplace_back(l,r); cnt+=r-l+1; while(cnt>=sz){ int dif=cnt-sz; block[cur].back().second-=dif; cur++; if(dif>0)block[cur].emplace_back(r-dif+1,r); cnt=dif; } } auto tmp=get(); vector<p2> res=block[tmp[0]]; for(auto x:block[tmp[1]])res.emplace_back(x); sol(res); }; sol({{1,N}}); return {ans[0],ans[1]}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...