제출 #795545

#제출 시각아이디문제언어결과실행 시간메모리
795545SlavicGMinerals (JOI19_minerals)C++17
40 / 100
84 ms3072 KiB
#include <bits/stdc++.h>
#include "minerals.h"
using namespace std;
 
#define all(v) v.begin(), v.end()
#define sz(a) (int)a.size()
#define pb push_back
#define rall(v) v.rbegin(),v.rend()
 
mt19937 rng(69);
void Solve(int n) {
    vector<int> p1, p2;
    int ans = 0, prevans = -1;
    vector<int> bulanea(2 * n);
    iota(bulanea.begin(), bulanea.end(), 1);
    shuffle(bulanea.begin(), bulanea.end(), rng);
    for(int i: bulanea) {
        ans = Query(i);
        if(ans == prevans) {
            p2.pb(i);
        } else {
            p1.pb(i);
        }
        prevans = ans;
    }
    assert(sz(p1) == n && sz(p2) == n);
    vector<int> pr(n, 0);
    int IN = 1;
    /*
    vector<bool> bagat(n, 1);
    for(int bit = 0; (1 << bit) < n; ++bit) {
        for(int i = 0; i < n; ++i) {
            if(i >> bit & 1) {
                if(!bagat[i]) prevans = Query(p1[i]);
                bagat[i] = 1;
            } else {
                if(bagat[i]) prevans = Query(p1[i]);
                bagat[i] = 0;
            }
        }   
        for(int i = 0; i < n; ++i) {
            int ans = Query(p2[i]);
            if(ans == prevans) {
                pr[i] += (1 << bit);
            }
            prevans = ans;
        }
        IN ^= 1;
    }
    */
    vector<int> l(n, 0), r(n, n - 1);
    int F = 0;
    int j = n - 1;
    for(int runs = 0; runs < 17; ++runs) {
        vector<pair<int, int>> b;
        for(int i = 0; i < n; ++i) {
            if(l[i] <= r[i]) {
                int mid = l[i] + r[i] >> 1;
                b.push_back({mid, i});
            }
        }
        int k = j;
        int cost1 = 0, cost2 = 0;
        sort(all(b));
        for(auto x: b) {
            int mid = x.first;
            while(k > mid) {
                --k;
                ++cost1;
            }
            while(k < mid) {
                ++k;
                ++cost1;
            }
        }
        k = j;
        sort(rall(b));
        for(auto x: b) {
            int mid = x.first;
            while(k > mid) {
                --k;
                ++cost2;
            }
            while(k < mid) {
                ++k;
                ++cost2;
            }
        }

        if(cost1 <= cost2) sort(all(b));
        else sort(rall(b));
 
        for(auto x: b) {
            int mid = x.first;
            while(j > mid) {
                prevans = Query(p1[j]);
                --j;
            }
            while(j < mid) {
                ++j;
                prevans = Query(p1[j]);
            }
            int ans = Query(p2[x.second]);
            if(ans == prevans) {
                pr[x.second] = mid;
                r[x.second] = mid - 1;
            } else {
                l[x.second] = mid + 1;
            }
            prevans = ans;
        }
        F ^= 1;
    }
    for(int i = 0; i < n; ++i) {
        Answer(p2[i], p1[pr[i]]);
    }
}
/*
4
1 5
2 6
3 4
7 8
*/

컴파일 시 표준 에러 (stderr) 메시지

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:58:32: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |                 int mid = l[i] + r[i] >> 1;
minerals.cpp:28:9: warning: unused variable 'IN' [-Wunused-variable]
   28 |     int IN = 1;
      |         ^~
#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...