Submission #1242791

#TimeUsernameProblemLanguageResultExecution timeMemory
1242791noyancanturkMessage (IOI24_message)C++20
95 / 100
441 ms868 KiB
#include "message.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define has(x,i) (((x)>>(i))&1) #define maxquer 67 vector<bool>debug; void send_message(vector<bool>m,vector<bool>c){ int top=!m.back(); while(m.size()<5000){ m.pb(top); } vector<vector<int>>lf,rg; vector<int>st1,st2; int ind=0; int asked=0; auto ask=[&](int toaskfrom,int guy) -> bool { asked++; vector<bool>toask(31); for(int i=0;i<31;i++){ if(!c[i]&&i!=toaskfrom){ toask[i]=m[ind++]; } } if(toaskfrom!=-1)toask[toaskfrom]=c[guy]; auto sent=send_packet(toask); return sent[toaskfrom]; }; int accuse[31]{}; for(int i=0;i<31;i++){ if(!st1.size()){ st1.pb(i); continue; } int query=ask(st1.back(),i); if(query){ accuse[st1.back()]|=1<<i; st2.pb(i); if(st1.size()==st2.size()){ lf.pb(st1); rg.pb(st2); st1.clear(); st2.clear(); } }else{ st1.pb(i); } } lf.pb(st1); rg.pb(st2); vector<int>good; int real=st1.back(); good.pb(real); for(int i=0;i<lf.size();i++){ auto l=lf[i]; auto r=rg[i]; reverse(l.begin(),l.end()); for(int j:l){ if(j==real)continue; int res=ask(real,j); if(!res){ accuse[real]|=accuse[j]; good.pb(j); if(good.size()==16)break; }else{ break; } } if(good.size()==16)break; for(int j:r){ if(has(accuse[real],j))continue; int res=ask(real,j); if(!res){ good.pb(j); if(good.size()==16)break; } } if(good.size()==16)break; } while(asked<maxquer){ ask(-1,0); } } vector<bool>receive_message(vector<vector<bool>>ms){ int asked[maxquer]{}; for(int i=0;i<maxquer;i++)asked[i]=-1; vector<vector<int>>lf,rg; vector<int>st1,st2; int ind=0; auto ask=[&](int toaskfrom) -> bool { asked[ind]=toaskfrom; vector<bool>sent=ms[ind++]; return sent[toaskfrom]; }; int accuse[31]{}; for(int i=0;i<31;i++){ if(!st1.size()){ st1.pb(i); continue; } int query=ask(st1.back()); if(query){ accuse[st1.back()]|=1<<i; st2.pb(i); if(st1.size()==st2.size()){ lf.pb(st1); rg.pb(st2); st1.clear(); st2.clear(); } }else{ st1.pb(i); } } lf.pb(st1); rg.pb(st2); vector<int>good; int real=st1.back(); good.pb(real); for(int i=0;i<lf.size();i++){ auto l=lf[i]; auto r=rg[i]; reverse(l.begin(),l.end()); for(int j:l){ if(j==real)continue; int res=ask(real); if(!res){ accuse[real]|=accuse[j]; good.pb(j); if(good.size()==16)break; }else{ break; } } if(good.size()==16)break; for(int j:r){ if(has(accuse[real],j))continue; int res=ask(real); if(!res){ good.pb(j); if(good.size()==16)break; } } if(good.size()==16)break; } sort(good.begin(),good.end()); vector<bool>m; for(int i=0;i<maxquer;i++){ for(int j:good){ if(j!=asked[i]){ m.pb(ms[i][j]); } } } int top=m.back(); while(m.back()==top){ m.pop_back(); } return m; } // void send_message(std::vector<bool> M, std::vector<bool> C) { // std::vector<bool> A(31, 0); // send_packet(A); // } // std::vector<bool> receive_message(std::vector<std::vector<bool>> R) { // return std::vector<bool>({0, 1, 1, 0}); // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...