Submission #963515

#TimeUsernameProblemLanguageResultExecution timeMemory
96351512345678Library (JOI18_library)C++17
100 / 100
224 ms716 KiB
#include <bits/stdc++.h>
#include "library.h"
using namespace std;

const int nx=1005;
int n, s=1;
vector<pair<int, int>> edg;
vector<int> v[nx], res;

int query(int l, int r)
{
    vector<int> qrs(n);
    for (int i=l; i<=r; i++) qrs[i-1]=1;
    int cnt=0;
    for (auto [x, y]:edg) if (l<=x&&y<=r) cnt++;
    return Query(qrs)+cnt;
}

void find_edge()
{
    int l=1, r=n;
    /*
    cout<<"test query : ";
    for (int i=1; i<=n; i++) cout<<query(1, i)<<' ';
    cout<<'\n'; */
    while (l<r)
    {
        int md=(l+r)/2;
        if (query(1, md)==md) l=md+1;
        else r=md;
    }
    int tmp=l;
    l=1, r=tmp;
    while (l<r)
    {
        int md=(l+r+1)/2;
        if (query(md, tmp)==tmp-md+1) r=md-1;
        else l=md;
    }
    edg.push_back({l, tmp});
    //cout<<"edge "<<l<<' '<<tmp<<'\n';
    //cout<<"debug "<<query(1, n)<<'\n';
}

void dfs(int u, int p)
{
	res.push_back(u);
	for (auto x:v[u]) if (x!=p) dfs(x, u);
}

void Solve(int N)
{
    n=N;
    //cout<<"test "<<query(1, n)<<'\n';
	for (int i=1; i<N; i++) find_edge();
    for (auto [x, y]:edg) v[x].push_back(y), v[y].push_back(x);
	for (int i=1; i<=N; i++) if (v[i].size()==1) s=i;
	dfs(s, s);
	Answer(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...