제출 #1355893

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

int o, n;

struct node{
    int l, r;
    int ls, rs;
    int c;
};
node st[400005];
int cnt=1;

void build( int l, int r, int idx ){
    st[idx].l=l;
    st[idx].r=r;
    st[idx].c=0;
    if( l+1==r ) return;
    else{
        int mid=(l+r)/2;
        int ls=st[idx].ls=cnt++;
        int rs=st[idx].rs=cnt++;
        build( l, mid, ls );
        build( mid, r, rs );
    }
}

int layer;
void modify( int x, int idx ){
    //cout << idx << '\n';
    if( st[idx].l==st[idx].r-1 ){
        st[idx].c++;
        layer--;
    }
    else{
        int mid=(st[idx].l+st[idx].r)/2;
        int ls=st[idx].ls;
        int rs=st[idx].rs;
        if( x<mid ) modify(x,ls);
        else modify(x,rs);
        st[idx].c=st[ls].c+st[rs].c;
        if( st[idx].c==st[idx].r-st[idx].l ) layer--;
    }
    //cout << idx << ' ' << "back\n";
}

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

    for( int i=1 ; i<n ; i++ ){
        int x;
        cin >> x;
        layer=18;
        modify( x, 0 );
        cout << layer << endl;
    }
}

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

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

int main(){

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

    cin >> o >> n;
    build( 0, n, 0 );
    if( o==1 ) Anna();
    else Bertil();

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