This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "grid.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
vector<int> ans;
bool usedIndex[1002], usedValue[1002];
int query(vector<int> vec){
    /// 실제: max(Ai + n - 1 - Bi), 이상: max(Ai + Bi)
    /// 따라서 수정이 필요
    vector<int> toQuery(n);
    for(int i=0; i<n; i++) toQuery[n-vec[i]] = i;
    return PutDisks(toQuery) + 1;
}
vector<int> SortDisks(int N){
    n = N;
    ans.resize(n);
    vector<int> vec(n);
    for(int i=0; i<n; i++) vec[i] = i+1;
    int val = -1, lastval = -1, exceed = -1; /// 바꾸고 난 뒤 val, 바꾸기 전 val, 넘었을 때 넘은 위치
    while(true){
        lastval = val, val = query(vec);
        if(val == n+1){ /// 모든 게 완벽하게 짝지어짐
            for(int i=0; i<n; i++) if(!usedIndex[i]){
                int ai = val - vec[i];
                ans[i] = ai;
            }
            break;
        }
        int criteria = val - n; /// rotate에 들어가는 기준
        int findingCnt = 0;
        for(int i=0; i<n; i++) if(!usedIndex[i] && vec[i] >= criteria) findingCnt++;
        if(findingCnt == 1 || (lastval != -1 && val > lastval-1)){ /// 남은 게 하나 or 1 감소하지 않아 exceed 처리
            int idx = 0;
            if(findingCnt == 1) while(usedIndex[idx] || vec[idx] < criteria) idx++;
            else idx = exceed;
            int ai = val - vec[idx];
            int bi = n + 1 - ai;
            int changedPosition = find(vec.begin(), vec.end(), bi) - vec.begin();
            swap(vec[idx], vec[changedPosition]), ans[idx] = ai, usedIndex[idx] = usedValue[bi] = 1;
            exceed = changedPosition;
            val = lastval;
            continue;
        }
        /// 이제 남은 게 여러 개고 1 감소한 상황
        vector<pair<int, int> > pairVec;
        for(int i=0; i<n; i++) if(!usedIndex[i] && vec[i] >= criteria){
            pairVec.push_back(make_pair(vec[i], i));
        }
        sort(pairVec.begin(), pairVec.end());
        /// 한 칸씩 오른쪽으로 민다
        for(int i=0; i<(int)pairVec.size()-1; i++){
            vec[pairVec[i+1].second] = pairVec[i].first;
        }
        vec[exceed = pairVec[0].second] = pairVec.back().first;
    }
	return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |