Submission #1148898

#TimeUsernameProblemLanguageResultExecution timeMemory
1148898yeysoMinerals (JOI19_minerals)C++20
40 / 100
10 ms1860 KiB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;
void Solve(int N) {
    int cur = 0;
    int prev = 0;
    int x = log2(N) + 1;
    //cout << x << " ";
    vector<int> binary(N + 1, 0);

    vector<int> firstgroup;
    vector<int> secondgroup; 
    for(int i = 1; i < 2 * N + 1; i ++){
        cur = Query(i);
        if(cur == prev){
            firstgroup.push_back(i);
        } else {
            secondgroup.push_back(i);
        }
        prev = cur;
    }
    for(int i = 1; i < 2 * N + 1; i ++){
        cur = Query(i);
    }
    /*for(int i = 0; i < firstgroup.size(); i ++){
        cout << firstgroup[i] << " ";
    } cout << "\n";
    for(int i = 0; i < secondgroup.size(); i ++){
        cout << secondgroup[i] << " ";
    } cout << "\n\n";*/
    for(int bit = 0; bit < x; bit ++){ 
        for(int i = 0; i < N; i ++){
            if(i & (1 << bit)){
                prev = Query(firstgroup[i]);
                //cout << firstgroup[i] << " ";
            } else {
                //cout << 0 << " ";
            } 
        } //cout << "\n";

        for(int i = 0; i < N; i ++){
            cur = Query(secondgroup[i]);
            if(cur == prev){
                binary[i] += (1 << bit);
            }
            prev = Query(secondgroup[i]);
        }
        for(int i = 0; i < N; i ++){
            if(i & (1 << bit)){
                prev = Query(firstgroup[i]);
            }
        }
    }
    for(int i = 0; i < N; i ++){
        //cout << secondgroup[i] << " : " << firstgroup[binary[i]] << "\n";
        Answer(secondgroup[i], firstgroup[binary[i]]);
    }
}
/*
g++ -std=gnu++17 -O2 -o minerals grader.cpp minerals.cpp
10
1 7
2 19
3 9
4 12
5 6
8 13
10 11
14 20
15 17
16 18
*/
/*void Solve(int N) {
    int cur = 0;
    int prev = 0;
    int x = log2(2 * N) + 1;
    vector<int> binary(2 * N + 1, 0);
    vector<int> a(2 * N + 1, 0);
    for(int bit = 0; bit < x; bit ++){ 
        // 15,000 changes per pass on average
        for(int i = 1; i <= 2 * N; i ++){
            int state = i & (1 << bit);
            int on = 0;
            if(state) on = 1;
            if(on != a[i]){
                prev = Query(i);
                a[i] ^= 1;
            }
            //cout << a[i] << " ";
        } //cout << "\n";
        for(int i = 1; i <= 2 * N; i ++){
            if(i & (1 << bit)){
                cur = Query(i);
                if(cur == prev){
                    binary[i] += (1 << bit);
                }
                prev = Query(i);
            }
        }
        // Bits that were originally off
        // 
        for(int i = 1; i <= 2 * N; i ++){
            if(!(i & (1 << bit))){
                cur = Query(i);
                a[i] ^= 1;
                if(cur == prev){
                    binary[i] += (1 << bit);
                } else {
                    prev = Query(i);
                    a[i] ^= 1;
                }
            }
        }
    }
    for(int i = 1; i <= 2 * N; i ++){
        if(i < binary[i]){
            //cout << i << " : " << binary[i] << "\n";
            Answer(i, binary[i]);
        }
    }
}*/
/*
g++ -std=gnu++17 -O2 -o minerals grader.cpp minerals.cpp
10
1 7
2 19
3 9
4 12
5 6
8 13
10 11
14 20
15 17
16 18



7
3 14
1 12
5 11
7 13
4 10
2 16
6 15

10
1 17
2 14
3 12
4 19
5 13
6 15
7 11
8 16
9 18
10 20
*/
#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...