Submission #1354836

#TimeUsernameProblemLanguageResultExecution timeMemory
1354836Francisco_MartinGuessing Game (EGOI23_guessinggame)C++20
100 / 100
399 ms1200 KiB
//EGOI 2023 Guessing Game
//https://qoj.ac/contest/1355/problem/7161

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
const ll MAXN = 100000;
const ll MOD = MAXN/2;

void encode(ll n){
    ll a, sum=0; vector<bool> vis(n,false);
    vll A; vector<bool> vis2(32,false);
    cout << 7 << endl;
    for(int i=0; i<n-1; i++){
        if(i==MAXN-32) for(int j=0; j<n; j++) if(!vis[j]) A.push_back(j), sum=(sum+j)%MOD;
        cin >> a; vis[a]=true; ll res=0;
        if(i<MAXN-32){cout << 7 << endl; continue;}
        auto id=find(A.begin(),A.end(),a)-A.begin(); vis2[id]=true;
        for(int k=5; k>=1; k--){
            ll l=(id>>k)<<k, r=l+(1ll<<k)-1; bool flag=true;
            for(int j=l; j<=r; j++) if(!vis2[j]){flag=false; break;}
            if(flag){res=k; break;}    
        }
        if(res!=0) cout << 5-res << endl;
        else cout << 5+((sum>>(id/2))&1) << endl;
    }
}

pair<ll,ll> solve(ll delta,ll lx,ll rx,vll &val,vll &ID){
    if(rx-lx==2) return {ID[lx],ID[lx+1]};
    vll A; ll m=(lx+rx)/2;
    for(int i=lx; i<rx; i++) if(val[i]==delta) A.push_back(i);
    if(A.size()==2) return {ID[A[0]],ID[A[1]]};
    if(A[0]<m) return solve(delta+1,m,rx,val,ID);
    return solve(delta+1,lx,m,val,ID);
}

void decode(ll n){
    vll A(n), B, C(32);
    for(int i=0; i<n; i++){
        cin >> A[i];
        if(A[i]!=7) B.push_back(i);
    }
    if(B.size()==31){
        ll sum1=0, sum2=0, cur=0;
        for(auto a:B){
            sum1+=(A[a]==6?1:0)*(1ll<<cur); sum2=(sum2+a)%MOD; cur+=(A[a]==5 || A[a]==6);
        }
        ll ans=(sum1-sum2+MOD)%MOD;
        cout << ans << " " << ans+MOD << endl; return;
    }
    for(int i=0; i<32; i++) C[i]=min(5ll,A[B[i]]);
    auto [ans1,ans2]=solve(1,0,32,C,B);
    cout << ans1 << " " << ans2 << endl;
}

int main(){
    ll p, n;
    cin >> p >> n;
    if(p==1) encode(n);
    else decode(n);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...