Submission #1170062

#TimeUsernameProblemLanguageResultExecution timeMemory
1170062TlenekWodoruMinerals (JOI19_minerals)C++20
40 / 100
31 ms4720 KiB
#include "minerals.h"
#include<bits/stdc++.h>
using namespace std;
void Solve(int n)
{
    const int N=n*2;
    int last=0;
    vector<int>A,B;
    vector<int>L;
    vector<int>g(N+1);
    for(int i=1;i<=N;i++){g[i]=i;}
    mt19937 rng(2137);
    shuffle(g.begin()+1,g.end(),rng);
    for(int i=1;i<=N;i++)
    {
        int u=g[i];
        int t=Query(u);
        if(t!=last){A.push_back(u);}
        else{B.push_back(u);L.push_back(A.size());}
        last=t;
    }
    vector<pair<int,int>>G(n);
    for(int i=0;i<n;i++)
    {
        G[i]={0,L[i]-1};
    }
    vector<vector<int>>V(n);
    bool Gyat=1;
    while(true)
    {
        bool cv=0;
        for(int i=0;i<n;i++)
        {
            if(G[i].first==G[i].second){continue;}
            cv=1;
            const int mid=(G[i].first+G[i].second)>>1;
            V[mid].push_back(i);
        }
        if(cv==0){break;}
        if(Gyat==0)
        {
            for(int i=0;i<n;i++)
            {
                last=Query(A[i]);
                for(int u : V[i])
                {
                    int t=Query(B[u]);
                    if(t==last)
                    {
                        G[u].second=i;
                    }
                    else
                    {
                        G[u].first=i+1;
                    }
                    last=t;
                }
                V[i].clear();
            }
        }
        else
        {
            for(int i=n-1;i>=0;i--)
            {
                for(int u : V[i])
                {
                    int t=Query(B[u]);
                    if(t==last)
                    {
                        G[u].second=i;
                    }
                    else
                    {
                        G[u].first=i+1;
                    }
                    last=t;
                }
                last=Query(A[i]);
                V[i].clear();
            }
        }
        Gyat^=1;
    }
    for(int i=0;i<n;i++)
    {
        Answer(A[G[i].first],B[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...