Submission #1294547

#TimeUsernameProblemLanguageResultExecution timeMemory
1294547NValchanovMeetings 2 (JOI21_meetings2)C++20
4 / 100
4089 ms672 KiB
#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 2e5 + 10;

int n;
vector < int > adj[MAXN];
bool chosen[MAXN];

vector < int > meeting[MAXN];
vector < int > locs[MAXN];
int ans[MAXN];

void read()
{
    cin >> n;

    for(int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;

        adj[u].push_back(v);
        adj[v].push_back(u);
    }
}

int dfs(int u, int p, int d)
{
    int result = 0;

    if(chosen[u])
        result += d;

    for(int v : adj[u])
    {
        if(v == p)
            continue;

        result += dfs(v, u, d + 1);
    }

    return result;
}

void solve()
{
    for(int mask = 0; mask < (1 << n); mask++)
    {
        int type = __builtin_popcount(mask);

        if(type == 0)
            continue;

        vector < int > meet;

        for(int i = 1; i <= n; i++)
        {
            chosen[i] = (bool)(mask & (1 << (i - 1))); 

            if(mask & (1 << (i - 1)))
                meet.push_back(i);
        }

        vector < int > min_locs;
        int mind = n * n;

        for(int l = 1; l <= n; l++)
        {
            int cur = dfs(l, l, 0);

            if(cur < mind)
            {
                mind = cur;
                min_locs.clear();
            }

            if(cur == mind)
            {
                min_locs.push_back(l);
            }
        }

        if(ans[type] < min_locs.size())
        {
            ans[type] = min_locs.size();
            locs[type] = min_locs;
            meeting[type] = meet;
        }
    }

    for(int type = 1; type <= n; type++)
    {
        cout << ans[type] << endl;
    }
}

int main()
{
    read();
    solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...