Submission #1355647

#TimeUsernameProblemLanguageResultExecution timeMemory
1355647yyc000123Guessing Game (EGOI23_guessinggame)C++20
90 / 100
434 ms2880 KiB
#include<bits/stdc++.h>
using namespace std ;
const int N = 1e5+5 ;
int p , n , m , seg[4*N] ;
vector<int> v[20] ;

int f(int le , int ri , int target , int v , int level){
    if(ri<target || target<le) return N ;
    if(le==target && ri==target){
        seg[v]++ ;
        return level ;
    }
    int mi = (le+ri)/2 ;
    int temp = f(le,mi,target,v<<1,level+1) ;
    temp = min(temp,f(mi+1,ri,target,(v<<1)|1,level+1)) ;
    seg[v]++ ;
    if(seg[v]==ri-le+1) return level ;
    else return temp ;
}

void solve1(){
    m = (int)log2(n-1)+1 ;
    cout << m << endl ;
    for(int i=1 ; i<n ; i++){
        int x ; cin >> x ;
        cout << f(0,n-1,x,1,0) << endl ;
    }
}

void solve2(){
    m = (int)log2(n-1)+1 ;
    for(int i=0 ; i<n ; i++){
        int x ; cin >> x ;
        v[x].push_back(i) ;
    }
    int le = 0 , ri = n-1 ;
    for(int i=1 ; i<=m ; i++){
        if(upper_bound(v[i].begin(),v[i].end(),ri)-lower_bound(v[i].begin(),v[i].end(),le)==2){
            int temp = lower_bound(v[i].begin(),v[i].end(),le)-v[i].begin() ;
            cout << v[i][temp] << ' ' << v[i][temp+1] << endl ;
            return ;
        }
        int temp = lower_bound(v[i].begin(),v[i].end(),le)-v[i].begin() , mi = (le+ri)/2 ;
        if(v[i][temp]>mi) ri = mi ;
        else le = mi+1 ;
        if(i==m) cout << v[i][temp] << ' ' << v[i][temp] << endl ;
    }
}

int main(){
    cin >> p >> n ;
    if(p==1) solve1() ;
    else solve2() ;
    return 0 ;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...