Submission #1332420

#TimeUsernameProblemLanguageResultExecution timeMemory
1332420danglayloi1The Ties That Guide Us (CEOI23_incursion)C++20
30 / 100
183 ms7400 KiB
// #define dak
#ifndef dak
#include "incursion.h"
#endif
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=45005;
int h[nx], par[nx], sz[nx], mp[nx];
vector<int> adj[nx], path, res;
void dfs(int p, int u)
{
    for(int v:adj[u])
        if(v!=p)
            h[v]=h[u]+1, dfs(u, v);
}
bool go(int p, int u, int v)
{
    if(u==v)
    {
        path.emplace_back(u);
        return 1;
    }
    for(int c:adj[u])
        if(c!=p && go(u, c, v))
        {
            path.emplace_back(u);
            return 1;
        }
    return 0;
}
bool sus(int p, int u, int S)
{
    if(u==S) return 1;
    bool ok=0;
    for(int v:adj[u])
        if(v!=p)
            ok|=sus(u, v, S);
    return ok;
}
vector<int> mark(vector<ii> ed, int safe)
{
    int n=ed.size();
    n++;
    int l=1;
    h[1]=0;
    for(int i = 1; i <= n; i++)
        adj[i].clear();
    for(auto it:ed)
        adj[it.fi].emplace_back(it.se), adj[it.se].emplace_back(it.fi);
    dfs(0, 1);
    int r=1;
    for(int i = 1; i <= n; i++)
        if(h[i]>h[r])
            r=i;
    h[r]=0;
    dfs(0, r);
    for(int i = 1; i <= n; i++)
        if(h[i]>h[l])
            l=i;
    path.clear();
    go(0, l, r);
    int root;
    if(h[l]&1)
    {
        if(sus(path[h[l]/2+1], path[h[l]/2], safe))
            root=path[h[l]/2];
        else root=path[h[l]/2+1];
    }
    else root=path[h[l]/2];
    res.assign(n, 0);
    path.clear();
    go(0, root, safe);
    for(int u:path)
        res[u-1]=1;
    return res;
}
void dfs1(int p, int u)
{
    sz[u]=1;
    for(int v:adj[u])
        if(v!=p)
            par[v]=u, dfs1(u, v), sz[u]+=sz[v];
}
#ifdef dak
int visit(int u)
{

}
#endif
void find(int p, int u)
{
    int bc=-1;
    for(int v:adj[u])
    {
        if(v==p) continue;
        if(bc==-1 || sz[bc]<sz[v])
            bc=v;
    }
    for(int v:adj[u])
    {
        if(v==p || v==bc) continue;
        if(visit(v)) return find(u, v);
        visit(u);
    }
    if(bc!=-1)
    {
        if(visit(bc)) return find(u, bc);
        visit(u);
    }
}
void locate(vector<ii> ed, int cur, int C)
{
    int n=ed.size();
    n++;
    int l=1;
    h[1]=0;
    for(int i = 1; i <= n; i++)
        adj[i].clear(), mp[i]=-1;
    mp[cur]=C;
    for(auto it:ed)
        adj[it.fi].emplace_back(it.se), adj[it.se].emplace_back(it.fi);
    dfs(0, 1);
    int r=1;
    for(int i = 1; i <= n; i++)
        if(h[i]>h[r])
            r=i;
    h[r]=0;
    dfs(0, r);
    for(int i = 1; i <= n; i++)
        if(h[i]>h[l])
            l=i;
    path.clear();
    go(0, l, r);
    int root=path[h[l]/2];
    for(int i = 1; i <= n; i++)
        par[i]=0;
    dfs1(0, root);
    while(C==0 && cur!=root)
        cur=par[cur], C=visit(cur);
    if(C==0)
    {
        root=path[h[l]/2+1];
        C=visit(root);
        if(C==0) assert(0);
        cur=root;
    }
    find(par[cur], cur);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...