Submission #1335555

#TimeUsernameProblemLanguageResultExecution timeMemory
1335555trandaihao5555Easter Eggs (info1cup17_eastereggs)C++20
10 / 100
8 ms480 KiB
#include <bits/stdc++.h>
#include "grader.h"

using namespace std;

#define pb push_back

template<class _,class __>
    bool minimize(_ & a,const __ b) {
        if (a > b) {
            a = b;
            return true;
        }
        return false;
    }

const int MaxN = 555;

int n,Tin[MaxN],Tout[MaxN],sz[MaxN],rot,delta;
bool isDel[MaxN];
vector<int> a[MaxN];

void dfs(int u,int p) {
    Tin[u] = ++Tin[0];
    sz[u] = 1;
    for (int v : a[u]) {
        if (isDel[v] || v == p) continue;
        dfs(v,u);
        sz[u] += sz[v];
    }
    Tout[u] = Tin[0];
}

void dfss(int u,int p,int r) {
    for (int v : a[u]) {
        if (v == p || isDel[v]) continue;
        if (minimize(delta,abs(sz[v] - (sz[r] - sz[v])))) rot = v;
        dfss(v,u,r);
    }
}

bool isPar(int u,int v) {
    return Tin[u] <= Tin[v] && Tout[v] <= Tout[u];
}

int findEgg (int N, vector < pair < int, int > > bridges)
{
//    if (query ({1})) return 1;
//    return N;
    n = N;
    for(pair<int,int> tmp : bridges) {
        int u = tmp.first;
        int v = tmp.second;
        a[u].pb(v);
        a[v].pb(u);
    }
    Tin[0] = 0;
    for(int i=1;i<=N;i++) {
        isDel[i] = false;
    }
    int root;
    while(true) {
        for(int i=1;i<=n;i++) {
            if (isDel[i]) continue;
            root = i;
            dfs(i,-1);
            break;
        }
        if(sz[root] == 1) break;
        delta = 1e9;
        dfss(root,-1,root);
        vector<int> tmp;
        for(int i=1;i<=n;i++) {
            if (!isDel[i] && isPar(rot,i)) tmp.pb(i);
        }
        if (query(tmp)) {
            for (int i=1;i<=n;i++) if (!isPar(rot,i)) isDel[i] = true;
        }
        else for(int i=1;i<=n;i++) if (isPar(rot,i)) isDel[i] = true;
    }
    for (int i=1;i<=N;i++) a[i].clear();
    return root;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...