제출 #1355863

#제출 시각아이디문제언어결과실행 시간메모리
1355863branches1029Guessing Game (EGOI23_guessinggame)C++20
0 / 100
404 ms7120 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int o, n;
int l[200005];
int r[200005];
int cnt[200005];
int zkw[200005];

void Anna(){
    cout << 17 << endl;

    for( int i=1 ; i<n ; i++ ){
        int x;
        cin >> x;
        x++;
        x+=(n-1);
        int layer=17;
        for( int j=(x>>1) ; j>0 ; (j>>=1) ){
            if( zkw[j]+1!=cnt[j] ) break;
            layer--;
        }
        cout << layer << endl;
        zkw[x]++;
        for( int j=(x>>1) ; j>0 ; (j>>=1) ){
            zkw[j]=zkw[j<<1]+zkw[j<<1|1];
        }
    }
}

int a[100005];
vector<int> v[20];

void Bertil(){
    for( int i=1 ; i<=n ; i++ ){
        cin >> a[i];
        v[a[i]].push_back(i);
    }
    int idx=1;
    for( int i=1 ; i<=17 ; i++ ){
        int fi=lower_bound( v[i].begin(), v[i].end(), l[idx] )-v[i].begin();
        assert(fi!=v[i].size());
        int se=lower_bound( v[i].begin(), v[i].end(), v[i][fi]+1 )-v[i].begin();
        if( se>=v[i].size() || v[i][se]>r[idx] ){
            if( l[idx<<1]<=v[i][fi] && v[i][fi]<=r[idx<<1] ){
                idx=(idx<<1|1);
            }
            else{
                idx=(idx<<1);
            }
        }
        else{
            cout << v[i][fi]-1 << ' ' << v[i][se]-1 << endl;
            break; 
        }
    }
}

int main(){

    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> o >> n;
    for( int i=1 ; i<=n ; i++ ){
        cnt[i+(n-1)]=1;
        l[i+(n-1)]=i;
        r[i+(n-1)]=i;
    }
    for( int i=n-1 ; i>=1 ; i-- ){
        cnt[i]+=cnt[i<<1]+cnt[i<<1|1];
        l[i]=l[i<<1];
        r[i]=r[i<<1|1];
    }
    if( o==1 ) Anna();
    else Bertil();

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…