This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "fun.h"
#include <bits/stdc++.h>
using namespace std;
const int nx=1e5+5;
int vs[nx], rt, pa[nx], deg[nx], h[nx];
vector<int> d[nx], res;
priority_queue<pair<int, int>> pql, pqr;
void dfs(int u)
{
if (!vs[pa[u]]&&pa[u]!=rt) deg[pa[u]]++;
for (auto v:d[u]) if (!vs[v]) h[v]=h[u]+1, dfs(v);
}
void dfsfill(int u, priority_queue<pair<int, int>> &pq)
{
if (deg[u]==0) pq.push({h[u], u});
for (auto v:d[u]) if (!vs[v]) dfsfill(v, pq);
}
std::vector<int> createFunTour(int N, int Q) {
for (int i=1; i<N; i++) d[(i-1)/2].push_back(i), pa[i]=(i-1)/2;
rt=0;
while (1)
{
int cnt=0;
for (auto x:d[rt]) if (!vs[x]) cnt++;
if (cnt==0)
{
res.push_back(rt);
break;
}
if (cnt==1)
{
res.push_back(rt);
vs[rt]=1;
for (auto x:d[rt])
{
if (!vs[x]);
rt=x;
break;
}
continue;
}
if (cnt==2)
{
for (int i=0; i<N; i++) deg[i]=0;
dfs(d[rt][0]);
dfsfill(d[rt][0], pql);
dfs(d[rt][1]);
dfsfill(d[rt][1], pqr);
if (pql.top().first<pqr.top().first) swap(pql, pqr);
while (!pql.empty())
{
auto [_, u]=pql.top();
pql.pop();
res.push_back(u);
vs[u]=1;
if (pa[u]!=rt) --deg[pa[u]];
if (pa[u]!=rt&°[pa[u]]==0) pql.push({h[pa[u]], pa[u]});
swap(pql, pqr);
}
res.push_back(rt);
vs[rt]=1;
int nrt=-1;
cnt=0;
for (auto x:d[rt]) if (!vs[x]) nrt=x;
if (nrt==-1) break;
rt=nrt;
}
}
/*
cout<<"res : ";
for (auto x:res) cout<<x<<' ';
cout<<'\n';
*/
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |