Submission #651339

#TimeUsernameProblemLanguageResultExecution timeMemory
651339TimDeeFlight to the Ford (BOI22_communication)C++17
15 / 100
110 ms118784 KiB
#include"communication.h"
#include <bits/stdc++.h>
using namespace std;
const int PAIU=100;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int a, int b) {
    return a+rng()%(b-a+1);
}
#define forn(i,n) for (int i=0; i<n; ++i)
pair<int,int> decode(int n) {
    int len=4;
    vector<vector<vector<vector<int>>>> dp((1<<len),vector<vector<vector<int>>>(len,vector<vector<int>>(2)));

    for (int x=0; x<(1<<len); ++x) {
        dp[x][0][0].push_back(x&1);
        dp[x][0][1].push_back(!(x&1));
        for (int l=1; l<len; ++l) {
            for (auto v:dp[x][l-1][0]) {
                dp[x][l][0].push_back(v+(x&(1<<l)));
                dp[x][l][1].push_back(v+((!((x>>l)&1))<<l));
            }
            for (auto v:dp[x][l-1][1]) {
                dp[x][l][0].push_back(v+(x&(1<<l)));
            }
        }
    }

    vector<int> a; forn(i,n) a.push_back(i+1);
    while (a.size()>2) {
        //cout<<"iter\n";
        //for (auto x:a) cout<<x<<' '; cout<<'\n';

        int n=a.size();
        int f = n/3 + !!(n%3);
        int s = 2*(n/3) + ((n%3) == 2);

        int y=0;
        for (int i=0; i<4; ++i) {
            y<<=1; y+=receive();
        }

        vector<int> b;
        vector<int> match;
        for (auto v:dp[0][len-1][0]) if (v==y) {
            for (int i=0; i<f; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[0][len-1][1]) if (v==y) {
            for (int i=0; i<f; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[6][len-1][0]) if (v==y) {
            for (int i=f; i<s; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[6][len-1][1]) if (v==y) {
            for (int i=f; i<s; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[9][len-1][0]) if (v==y) {
            for (int i=s; i<n; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[9][len-1][1]) if (v==y) {
            for (int i=s; i<n; ++i) b.push_back(a[i]);
        }
        a=b;

    }
    if (a.size()==1) a.push_back(a[0]);
    return {a[0],a[1]};

}

void encode(int n, int x) {

    int len=4;
    vector<vector<vector<vector<int>>>> dp((1<<len),vector<vector<vector<int>>>(len,vector<vector<int>>(2)));

    for (int x=0; x<(1<<len); ++x) {
        dp[x][0][0].push_back(x&1);
        dp[x][0][1].push_back(!(x&1));
        for (int l=1; l<len; ++l) {
            for (auto v:dp[x][l-1][0]) {
                dp[x][l][0].push_back(v+(x&(1<<l)));
                dp[x][l][1].push_back(v+((!((x>>l)&1))<<l));
            }
            for (auto v:dp[x][l-1][1]) {
                dp[x][l][0].push_back(v+(x&(1<<l)));
            }
        }
        //if (x==0 || x==6 || x==9 || x==15) {
        //cout<<x<<": ";
        //for (auto p:dp[x][len-1][0]) cout<<p<<' ';
        //for (auto p:dp[x][len-1][1]) cout<<p<<' ';
        //cout<<'\n';
        //}
    }
    
    vector<int> a; forn(i,n) a.push_back(i+1);
    while (a.size()>2) {
        //cout<<"iter\n";
        //for (auto x:a) cout<<x<<' '; cout<<'\n';

        int n=a.size();
        int f = n/3 + !!(n%3);
        int s = 2*(n/3) + ((n%3) == 2);

        int l=0, r=n-1;
        while (l<r) {
            int mid=(l+r+1)>>1;
            if (a[mid]>x) r=mid-1;
            else l=mid;
        }
        int y=0;
        if (r<f) {
            y<<=1; y+=send(0);
            y<<=1; y+=send(0);
            y<<=1; y+=send(0);
            y<<=1; y+=send(0);
        } else if (r<s) {
            y<<=1; y+=send(0);
            y<<=1; y+=send(1);
            y<<=1; y+=send(1);
            y<<=1; y+=send(0);
        } else {
            y<<=1; y+=send(1);
            y<<=1; y+=send(0);
            y<<=1; y+=send(0);
            y<<=1; y+=send(1);
        }
        vector<int> b;
        vector<int> match;
        for (auto v:dp[0][len-1][0]) if (v==y) {
            for (int i=0; i<f; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[0][len-1][1]) if (v==y) {
            for (int i=0; i<f; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[6][len-1][0]) if (v==y) {
            for (int i=f; i<s; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[6][len-1][1]) if (v==y) {
            for (int i=f; i<s; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[9][len-1][0]) if (v==y) {
            for (int i=s; i<n; ++i) b.push_back(a[i]);
        }
        for (auto v:dp[9][len-1][1]) if (v==y) {
            for (int i=s; i<n; ++i) b.push_back(a[i]);
        }
        a=b;

    }

    return;
    
    for (int i=0; i<(1<<len); ++i) {
        for (int j=i+1; j<(1<<len); ++j) {
            for (int k=j+1; k<(1<<len); ++k) {
                for (int l=k+1; l<(1<<len); ++l) {
                    int paiu=0;
                    for (auto x:dp[i][len-1][0]) {
                        for (auto y:dp[j][len-1][0]) {
                            for (auto z:dp[k][len-1][0]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                            for (auto z:dp[k][len-1][1]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                        }
                        for (auto y:dp[j][len-1][1]) {
                            for (auto z:dp[k][len-1][0]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                            for (auto z:dp[k][len-1][1]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                        }
                    }
                    for (auto x:dp[i][len-1][1]) {
                        for (auto y:dp[j][len-1][0]) {
                            for (auto z:dp[k][len-1][0]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                            for (auto z:dp[k][len-1][1]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                        }
                        for (auto y:dp[j][len-1][1]) {
                            for (auto z:dp[k][len-1][0]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                            for (auto z:dp[k][len-1][1]) {
                                for (auto q:dp[l][len-1][0]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                                for (auto q:dp[l][len-1][1]) {
                                    paiu|=(x==y && y==z);
                                    paiu|=(x==y && y==q);
                                    paiu|=(x==z && z==q);
                                    paiu|=(y==z && z==q);
                                }
                            }
                        }
                    }
                    if (paiu==0) {
                        cout<<"! "<<i<<' '<<j<<' '<<k<<' '<<l<<'\n';
                    }
                }
            }
        }
    }
    

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...