제출 #502432

#제출 시각아이디문제언어결과실행 시간메모리
50243279brueMinerals (JOI19_minerals)C++14
90 / 100
38 ms2832 KiB
#include "minerals.h"
#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

int n;
bool chk[100002];
int order[100002], ocnt;
int ans[100002];
bool in[100002];
int lastRet;

int query(int x){
    in[x] = !in[x];
    return Query(order[x]);
}

void solve(int l, int r, vector<int>& vec){
    if(l==r){
        ans[l] = vec[0];
        return;
    }
    if(r-l==1){
        if((in[vec[0]] ^ in[vec[1]]) && (!in[l] || !in[r])){
            int tmp;
            if(!in[l]) tmp = query(l);
            else tmp = query(r);
            if(in[l] ^ in[vec[0]]){
                if(tmp == lastRet) ans[l] = vec[1], ans[r] = vec[0];
                else ans[l] = vec[0], ans[r] = vec[1];
            }
            else{
                if(tmp != lastRet) ans[l] = vec[1], ans[r] = vec[0];
                else ans[l] = vec[0], ans[r] = vec[1];
            }
            lastRet = tmp;
            return;
        }
    }

    int m = (l+r)>>1;
    if(r-m < m-l+1) m--;

    int tmpCalc = 0;
    bool st = 0;
    for(int i=l; i<=m; i++) if(!in[i]) tmpCalc++;
    for(int i=m+1; i<=r; i++) if(in[i]) tmpCalc++;
    if(tmpCalc * 2 > r-l+1) st = 1;

    for(int i=l; i<=m; i++){
        if(in[i] == st) lastRet = query(i);
    }
    for(int i=m+1; i<=r; i++){
        if(in[i] != st) lastRet = query(i);
    }

    vector<int> lVec, rVec;
    for(auto x: vec){
        if((int)lVec.size() == m-l+1){
            rVec.push_back(x);
            continue;
        }
        else if((int)rVec.size() == r-m){
            lVec.push_back(x);
            continue;
        }
        int tmp = query(x);
        if((tmp == lastRet) ^ st) lVec.push_back(x);
        else rVec.push_back(x);
        lastRet = tmp;
    }

    solve(l, m, lVec);
    solve(m+1, r, rVec);
}

void Solve(int N){
    n = N;
    for(int i=1; i<=n+n; i++){
        int tmp = Query(i);
        if(tmp != lastRet) order[++ocnt] = i, chk[i] = 1;
        lastRet = tmp;
        in[i] = 1;
    }
    for(int i=1; i<=n+n; i++) if(!chk[i]) order[++ocnt] = i;

    vector<int> tVec;
    for(int i=n+1; i<=n+n; i++) tVec.push_back(i);
    solve(1, n, tVec);
    for(int i=1; i<=n; i++) Answer(order[i], order[ans[i]]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...