Submission #163814

#TimeUsernameProblemLanguageResultExecution timeMemory
163814combi1k1Unique Cities (JOI19_ho_t5)C++14
100 / 100
563 ms38192 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll  long long
#define pb  push_back
#define X   first
#define Y   second

#define FOR(i,a,b)  for(int i = a ; i < b ; ++i)

const int   N   = 2e5 + 1;

vector<int> g[N];

namespace Diameter  {
    int Max;
    int fin;
    int L, R;

    int dfs(int u,int p,int d)  {
        if (Max < d)    {
            Max = d;
            fin = u;
        }
        for(int v : g[u])   if (v != p)
            dfs(v,u,d + 1);
        return  fin;
    }
    int LamViecCanLam() {
        Max = fin = 0;  L = dfs(1,0,0);
        Max = fin = 0;  R = dfs(L,0,0);

        return  1;
    }
};

using Diameter::L;
using Diameter::R;

array<int,2> MaxDep[N];

int dep[N], dig[N];
int ans[N], cnt[N];

int res = 0;

int c[N];

stack<int>  st;

void add(int u) {
    st.push(u);
    cnt[c[u]]++;

    res += (cnt[c[u]] == 1);
}
void rem(int h) {
    while (st.size() && h <= dep[st.top()]) {
        int x = st.top();   st.pop();
        cnt[c[x]]--;
        res -= (cnt[c[x]] == 0);
    }
}

void upd(int u,int V)   {
    if (MaxDep[u][1] < V)   MaxDep[u][1] = V;
    if (MaxDep[u][1] > MaxDep[u][0])
        swap(MaxDep[u][1],MaxDep[u][0]);
}

void dfs(int u,int p)   {
    rem(2 * dep[u] - MaxDep[u][1]);
    add(u);

    for(int v : g[u])   if (v == dig[u])
        dfs(v,u);

    rem(2 * dep[u] - MaxDep[u][0]);

    ans[u] = max(ans[u],res);

    for(int v : g[u])   if (v != p && v != dig[u])  {
        if (st.empty() || st.top() != u)
            add(u);
        dfs(v,u);
    }
    rem(dep[u]);
}

int ini(int u,int p)    {
    dep[u] = dep[p] + 1;
    dig[u] = u;

    MaxDep[u][0] = dep[u];
    MaxDep[u][1] = dep[u];

    for(int v : g[u])   if (v != p) {
        ini(v,u);
        upd(u,MaxDep[v][0]);

        if (MaxDep[u][0] == MaxDep[v][0])
            dig[u] = v;
    }
}

int main()  {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;  cin >> n;
    int m;  cin >> m;

    FOR(i,1,n)  {
        int x;  cin >> x;
        int y;  cin >> y;

        g[x].pb(y);
        g[y].pb(x);
    }
    FOR(i,1,n + 1)  cin >> c[i];

    Diameter::LamViecCanLam();

    ini(L,0);   dfs(L,0);
    ini(R,0);   dfs(R,0);

    FOR(i,1,n + 1)
        cout << ans[i] << "\n";
}
/*
10 10
2 6
5 8
10 8
1 4
10 6
4 5
10 7
6 9
3 7
1 2 3 4 5 6 7 8 9 10
*/

Compilation message (stderr)

joi2019_ho_t5.cpp: In function 'int ini(int, int)':
joi2019_ho_t5.cpp:105:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...