제출 #1331618

#제출 시각아이디문제언어결과실행 시간메모리
1331618ThanhsThe Ties That Guide Us (CEOI23_incursion)C++20
0 / 100
64 ms6904 KiB
#include "incursion.h"
#include <bits/stdc++.h>
using namespace std;

#define setmax(x, y) x = max((x), (y))
#define all(x) x.begin(), x.end()
#define fi first
#define se second

const int NM = 45000 + 5;

int n, sz[NM], dep[NM], sf, par[NM];
vector<int> g[NM], ans;

int dfs_sz(int u, int p = -1)
{
    sz[u] = 1;
    for (int v : g[u])
        if (v != p)
        {
            dep[v] = dep[u] + 1;
            sz[u] += dfs_sz(v, u);
        }
    return sz[u];
}

int SZ(int u, int v)
{
    return dep[u] < dep[v] ? sz[v] : n - sz[u];
}

bool cen(int u)
{
    for (int v : g[u])
        if (SZ(u, v) > n / 2)
            return 0;
    return 1;
}

int dfsm(int u, int p = 0)
{
    for (int v : g[u])
        if (v != p)
            ans[u - 1] |= dfsm(v, u);
    ans[u - 1] |= u == sf;
    return ans[u - 1];
}

int dfsc(int u, int p = 0)
{
    sz[u] = 1;
    for (int v : g[u])
        if (v != p)
        {
            dep[v] = dep[u] + 1;
            par[v] = u;
            sz[u] += dfsc(v, u);
        }
    return sz[u];
}

vector<int> mark(vector<pair<int, int>> F, int safe)
{
    n = F.size() + 1, sf = safe;
    for (auto t : F)
        g[t.fi].push_back(t.se), g[t.se].push_back(t.fi);
    dfs_sz(safe);
    ans.resize(n);
    int c = 0;
    for (int i = 1; i <= n; i++)
        if (cen(i))
        {
            if (c)
                c = dep[i] < dep[c] ? i : c;
            else
                c = i;
        }
    dfsm(c);
    return ans;
}

void locate(vector<pair<int, int>> F, int curr, int t)
{
    n = F.size() + 1;
    for (int i = 1; i <= n; i++)
        g[i].clear();
    for (auto t : F)
        g[t.fi].push_back(t.se), g[t.se].push_back(t.fi);
    dfs_sz(1);
    int c;
    for (int i = n; i >= 1; i--)
        if (cen(i))
        {
            sort(all(g[i]), [&](int x, int y){return SZ(i, x) < SZ(i, y);});
            c = i;
        }
    dfsc(c);
    for (int i = 1; i <= n; i++)
            if (par[i])
                g[i].erase(find(all(g[i]), par[i]));
    int u = curr;
    while (!t && par[u])
    {
        g[par[u]].erase(find(all(g[par[u]]), u));
        t = visit(u = par[u]);
    }
    int x = u;
    while (!t || g[u].size())
    {
        if (u == x || t)
        {
            int v = g[u].back();
            g[v].erase(find(all(g[v]), u));
            t = visit(u = g[u].back());
        }
        else
        {
            g[par[u]].erase(find(all(g[par[u]]), u));
            t = visit(u = par[u]);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...