Submission #1355877

#TimeUsernameProblemLanguageResultExecution timeMemory
1355877sallyGuessing Game (EGOI23_guessinggame)C++20
0 / 100
418 ms4904 KiB
#include<iostream>
#include<vector>
#include<map>
#define lc (p<<1)
#define rc ((p<<1)|1)
#define mid ((l+r)>>1)
using namespace std;

int P, N;
int K = 0;
vector<int> seg(4*100001+10, 0);
int upd(int p, int l, int r, int val, int layer) {
    seg[p]+=1;
    //cout<<seg[p]<<' '<<l<<' '<<r<<' '<<val<<' '<<layer<<endl;
    if(seg[p] == (r - l + 1)) return layer;
    if(val<=mid) return upd(lc, l, mid, val, layer+1);
    else return upd(rc, mid+1, r, val, layer+1);
}
void p1() {
    int cnt1 = 1, cnt2 = 1;
    cout<<upd(1, 1, N, 1, 0)<<endl;
    seg.assign(4*100001+10, 0);
    for(int i = 0; i<N-1; i++) {
        int idx;
        cin>>idx;
        idx++;
        cout<<upd(1, 1, N, idx, 0)<<endl;
    } 
}
void p2() {
    int g1 = -1, g2 = -1;
    vector<int> mp1(N, -1), mp2(N,-1);
    vector<int> nums(N+1);
    K = upd(1, 1, N, 1, 0);
    vector<vector<int>> pos(N/2);
    for(int i=1; i<=N; i++) {
        int in;
        cin>>in;
        nums[i] = in;
        pos[in].push_back(i);
    }
    if(pos[0].size()) {cout<<pos[0][0]-1<<' '<<pos[0][0]-1<<endl; return;}
    else if(pos[1].size()>1) {cout<<pos[1][0]-1<<' '<<pos[1][1]-1<<endl; return;}
    int L = 1, R = N;
    int layer = 1;
    while(L+1<R) {
        int m = (L+R)/2;
        int ind1 = lower_bound(pos[layer].begin(), pos[layer].end(), L) - pos[layer].begin();
        int ind2 = lower_bound(pos[layer].begin(), pos[layer].end(), R) - pos[layer].begin();
        //cout<<L<<' '<<R<<' '<<ind1<<' '<<ind2<<endl;
        if(ind2<pos[layer].size() && pos[layer][ind2]<=R) { // 理論上要找到同一個,但這裡找到2個
            cout<<pos[layer][ind1]-1<<' '<<pos[layer][ind2]-1<<endl;
            return;
        }
        else {
            //cout<<"pos[layer][ind1] = "<<pos[layer][ind1]<<'\n';
            if(pos[layer][ind1]<=m) { //左邊是沒問題的
                L = m+1;
            }
            else {
                R = m;
            }
        }
        layer++;
    }
    cout<<L-1<<' '<<R-1<<endl;
}
int main() {
    cin>>P>>N;
    if(P==1) p1();
    else p2();
}

/*
2 8

*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...