Submission #824859

#TimeUsernameProblemLanguageResultExecution timeMemory
824859LucaIlieMinerals (JOI19_minerals)C++17
40 / 100
24 ms2892 KiB
#include "minerals.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 43000;
const int UNDEF = -1;
int pairr[2 * MAX_N + 1], perm[2 * MAX_N + 1];
bool isFirst[2 * MAX_N + 1];
int ans = 0;

void solve( vector <int> &v, bool active ) {
    int n = v.size() / 2, ln = n / 2;
    vector<int> left, right;

    /*printf( "%d %d: ", n, active );
    for ( int i: v )
        printf( "%d ", perm[i] );
    printf( "\n" );*/

    if ( n == 1 ) {
        pairr[v[0]] = v[1];
        pairr[v[1]] = v[0];
        return;
    }

    int pairs = 0;
    for ( int i: v ) {
        if ( isFirst[i] ) {
            if ( pairs == ln ) {
                right.push_back( i );
                ans = Query( perm[i] );
            }
            else {
                left.push_back( i );
                pairs++;
            }
        } else {
            if ( pairs == ln ) {
                int prevAns = ans;
                ans = Query( perm[i] );
                if ( (!active && ans > prevAns) || (active && ans == prevAns) ) {
                    ans = Query( perm[i] );
                    left.push_back( i );
                } else
                    right.push_back( i );
            } else
                left.push_back( i );
        }
    }

    solve( left, active );
    solve( right, !active );
}

void Solve( int n ) {
    vector<int> v;
    for ( int i = 1; i <= 2 * n; i++ ) {
        pairr[i] = UNDEF;
        v.push_back( i );
        perm[i] = i;
    }
    random_shuffle( perm + 1, perm + 1 + 2 * n );

    int prevAns = 0;
    for ( int i = 1; i <= 2 * n; i++ ) {
        ans = Query( perm[i] );
        isFirst[i] = (ans > prevAns);
        //printf( "%d\n", isFirst[i] );
        prevAns = ans;
    }

    solve( v, true );
    for ( int i = 1; i <= 2 * n; i++ ) {
        if ( pairr[i] < i )
            Answer( perm[i], perm[pairr[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...