Submission #652040

#TimeUsernameProblemLanguageResultExecution timeMemory
652040TimDeeFlight to the Ford (BOI22_communication)C++17
15 / 100
7379 ms35268 KiB
#include"communication.h" #include <bits/stdc++.h> using namespace std; #define forn(i,n) for (int i=0; i<n; ++i) #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") vector<int> V; void brut(int x, int n, int v=0, int i=0, int l=0) { if (i>=n) {V.push_back(v); return;} int b=(x>>i)&1; brut(x,n,v+(b<<i),i+1,0); if (l==0) brut(x,n,v+((!b)<<i),i+1,1); } vector<int> get_possible(int n) { int x=0, q=0; forn(i,29) { q=receive(); x+=q<<i; } brut(x,29,0,0,0); vector<int> b; for (auto x:V) { if (x>=n) continue; for (int i=0; i+x<n; i+=1<<29) { b.push_back(x); } } V.clear(); return b; } vector<int> dequery(vector<int>&a,int bit) { int x=0, q; forn(i,bit) x+=receive()<<i; brut(x,bit); vector<int> b; for (auto x:V) { if (x>=a.size()) continue; for (int i=0; i+x<a.size(); i+=(1<<bit)) { b.push_back(a[i+x]); } } V.clear(); return b; } pair<int,int> decode(int n) { vector<int> a=get_possible(n); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=dequery(a,21); a=dequery(a,15); a=dequery(a,11); a=dequery(a,8); a=dequery(a,6); a=dequery(a,4); a=dequery(a,3); a=dequery(a,4); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=dequery(a,3); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=dequery(a,2); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=dequery(a,2); //for (auto x:a) cout<<x<<' '; cout<<'\n'; if (a.size()==1) return{a[0]+1,a[0]+1}; if (a.size()==2) return{a[0]+1,a[1]+1}; assert(a.size()==3); int q,x=0; q=receive(); x+=q<<0; q=receive(); x+=q<<1; q=receive(); x+=q<<2; q=receive(); x+=q<<3; vector<int> ans; vector<int> A={0,1,5,10,9,8,2,4}; vector<int> B={1,8,9,11,13,3,12,0}; vector<int> C={6,15,2,4,12,3,7,14}; for (auto v:A) if (v==x) ans.push_back(a[0]); for (auto v:B) if (v==x) ans.push_back(a[2]); for (auto v:C) if (v==x) ans.push_back(a[1]); if (ans.size()==1) return {ans[0]+1,ans[0]+1}; return {ans[0]+1,ans[1]+1}; } int Send(int x, int bit) { int ret=0; forn(i,bit) ret+=send((x>>i)&1)<<i; return ret; } vector<int> get_possible(int n, int x) { x=Send(x,29); brut(x,29); vector<int> b; for (auto x:V) { if (x>=n) continue; for (int i=0; i+x<n; i+=1<<29) { b.push_back(x); } } V.clear(); return b; } vector<int> query(vector<int>&a,int x,int bit) { int r=0; while (a[r]!=x) if (r>=a.size()) exit(1); else ++r; r=Send(r,bit); brut(r,bit); vector<int> b; for (auto x:V) { if (x>=a.size()) continue; for (int i=0; i+x<a.size(); i+=(1<<bit)) { b.push_back(a[i+x]); } } V.clear(); return b; } void encode(int n, int x) { --x; vector<int> a=get_possible(n,x); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=query(a,x,21); a=query(a,x,15); a=query(a,x,11); a=query(a,x,8); a=query(a,x,6); a=query(a,x,4); a=query(a,x,3); a=query(a,x,4); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=query(a,x,3); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=query(a,x,2); //for (auto x:a) cout<<x<<' '; cout<<'\n'; a=query(a,x,2); //for (auto x:a) cout<<x<<' '; cout<<'\n'; if (a.size()<3) return; assert(a.size()==3); int v=0,b=0;; if (x==a[0]) { b=send(0); v+=b<<0; b=send(0); v+=b<<1; b=send(0); v+=b<<2; b=send(0); v+=b<<3; } else if (x==a[1]) { b=send(0); v+=b<<0; b=send(1); v+=b<<1; b=send(1); v+=b<<2; b=send(0); v+=b<<3; } else { b=send(1); v+=b<<0; b=send(0); v+=b<<1; b=send(0); v+=b<<2; b=send(1); v+=b<<3; } }

Compilation message (stderr)

communication.cpp: In function 'std::vector<int> dequery(std::vector<int>&, int)':
communication.cpp:41:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |         if (x>=a.size()) continue;
      |             ~^~~~~~~~~~
communication.cpp:42:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         for (int i=0; i+x<a.size(); i+=(1<<bit)) {
      |                       ~~~^~~~~~~~~
communication.cpp:35:14: warning: unused variable 'q' [-Wunused-variable]
   35 |     int x=0, q;
      |              ^
communication.cpp: In function 'std::vector<int> query(std::vector<int>&, int, int)':
communication.cpp:116:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |     while (a[r]!=x) if (r>=a.size()) exit(1); else ++r;
      |                         ~^~~~~~~~~~
communication.cpp:121:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |   if (x>=a.size()) continue;
      |       ~^~~~~~~~~~
communication.cpp:122:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |   for (int i=0; i+x<a.size(); i+=(1<<bit)) {
      |                 ~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...