제출 #1337697

#제출 시각아이디문제언어결과실행 시간메모리
1337697aaaaaaaaMinerals (JOI19_minerals)C++20
40 / 100
22 ms4764 KiB
#include <bits/stdc++.h>
#include "minerals.h"
using namespace std;

void Solve(int N) {
    vector<int> left, right, ans((N + 1) * 2 + 10, 0), st((2 * N + 5), 0), en((2 * N + 5), 0), done((2 * N + 10), 0);
    vector<int> point[N + 10];
    for(int i = 1, prev; i <= 2 * N; ++i){
        int cur = Query(i);
        if(prev == cur) right.push_back(i);
        else left.push_back(i);
        swap(cur, prev);
    }
    for(int i = 0; i < (int) right.size(); ++i){
        st[i] = 0, en[i] = (int) left.size() - 1;
        point[(st[i] + en[i]) / 2].push_back(i);
    }
    for(int i = 1; i <= 2 * N; ++i) Query(i);
    for(int _ = 0; _ < 50; ++_){
        for(int i = 0, prev = -1; i < (int) left.size(); ++i){
            if(!done[left[i]]) prev = Query(left[i]);
            for(auto v : point[i]){
                int res = Query(right[v]);
                if(res == prev){
                    ans[right[v]] = left[i];
                    en[v] = i - 1;
                }else{
                    st[v] = i + 1;
                }
                Query(right[v]);
            }
            point[i].clear();
        }
        for(int i = 0; i < (int) left.size(); ++i){
            if(!done[left[i]]) Query(left[i]);
        }
        for(int i = 0; i < (int) right.size(); ++i){
            if(st[i] <= en[i]){
                point[(st[i] + en[i]) / 2].push_back(i);
            }else{
                done[ans[right[i]]] = 1;
            }
        }

    }
    for(int i = 1; i <= 2 * N; ++i){
        if(ans[i]){
            Answer(ans[i], 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...