Submission #1170159

#TimeUsernameProblemLanguageResultExecution timeMemory
1170159jerzykMinerals (JOI19_minerals)C++20
80 / 100
23 ms3928 KiB
#include <bits/stdc++.h>
#include "minerals.h"

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 50'000;
vector<pair<int, int>> ans;
vector<int> nxtp, nxtk;
int aktr = 0;

void DC(bool czyp, bool czyk)
{
    if((int)nxtp.size() == 1)
    {
        //cout << "A: " << nxt[0] << " " << nxt[1] << "\n";
        ans.pb(make_pair(nxtp[0], nxtk[0]));
        return;
    }
    //cout << "DC: " << nxtp.size() << " " << nxtk.size() << "\n";
    int n = (int)nxtp.size();
    int tr = (n + 1) / 2;
    vector<int> poc = nxtp, kon = nxtk;
    vector<int> lp, lk, rp, rk;
    for(int i = 0; i < tr; ++i)
        lp.pb(poc[i]);
    for(int i = tr; i < n; ++i)
        rp.pb(poc[i]);
    if(czyp)
        for(int i = 0; i < (int)rp.size(); ++i)
            aktr = Query(rp[i]);
    else
        for(int i = 0; i < (int)lp.size(); ++i)
            aktr = Query(lp[i]);
    int prev = aktr;
    if(czyk)
    {
        for(int i = 0; i < (int)kon.size(); ++i)
        {
            aktr = Query(kon[i]);
            if(aktr < prev)
                rk.pb(kon[i]);
            else
                lk.pb(kon[i]);
            prev = aktr;
        }
    }else
    {
        for(int i = 0; i < (int)kon.size(); ++i)
        {
            aktr = Query(kon[i]);
            if(aktr > prev)
                rk.pb(kon[i]);
            else
                lk.pb(kon[i]);
            prev = aktr;
        }
    }
    nxtp = lp; nxtk = lk;
    DC(1, czyk ^ 1);

    nxtp = rp; nxtk = rk;
    DC(0, czyk ^ 1);
}

void Solve(int _N)
{
    int n = _N, prev = 0;
    for(int i = 1; i <= 2 * n; ++i)
    {
        aktr = Query(i);
        if(aktr > prev) nxtp.pb(i);
        else nxtk.pb(i);
        prev = aktr;
    }
    DC(1, 1);
    for(int i = 0; i < (int)ans.size(); ++i)
        Answer(ans[i].st, ans[i].nd);
}
#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...