제출 #620041

#제출 시각아이디문제언어결과실행 시간메모리
620041AbdelmagedNourMergers (JOI19_mergers)C++17
100 / 100
1154 ms194108 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
long long p[N][20],val[N],dep[N],st[N],id;
vector<vector<int>>adj;
void pre_dfs(int v,int par){
    p[v][0]=par;
    st[v]=id++;
    for(int i=1;i<20;i++)p[v][i]=p[p[v][i-1]][i-1];
    for(auto&u:adj[v]){
        if(u==par)continue;
        dep[u]=dep[v]+1;
        pre_dfs(u,v);
    }
}
int P[N],sz[N];
int f(int x){
    return (P[x]==x?x:P[x]=f(P[x]));
}
void join(int a, int b){
	a=f(a),b=f(b);
	if(a==b)return;
	if(sz[a]<sz[b])swap(a, b);
	P[b]=a;
	sz[a]+=sz[b];
}
void dfs_up(int v,int par){
    for(auto&u:adj[v]){
        if(u==par)continue;
        dfs_up(u,v);
        val[v]+=val[u];
    }
    if(val[v])join(v,par);
}
int LCA(int u,int v){
    if(u==v)return u;
    if(dep[u]<dep[v])swap(u,v);
    int k=dep[u]-dep[v];
    for(int i=__lg(k+1);i>=0;i--){
        if(k&(1<<i))u=p[u][i];
    }
    if(u==v)return u;
    for(int i=__lg(dep[u]+1);i>=0;i--){
        if(p[u][i]==p[v][i])continue;
        u=p[u][i];
        v=p[v][i];
    }
    return p[u][0];
}
int cnt(int v,int par){
    int res=0;
    for(auto&u:adj[v]){
        if(u==par)continue;
        res+=cnt(u,v);
    }
    return max(res,(val[v]==0?1:0));
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,k;
    cin>>n>>k;
    adj.resize(n+1);
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    pre_dfs(1,0);
    vector<vector<int>>state(k+1);
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        state[x].push_back(i);
    }
    for(int i=1;i<=k;i++){
        sort(state[i].begin(),state[i].end(),[](int i,int j){
                return st[i]<st[j];
             });
        int lca=LCA(state[i][0],state[i].back());
        for(int j=0;j<state[i].size();j++){
            int u=state[i][j];
            val[u]++;val[lca]--;
        }
    }
    iota(P,P+n+1,0);
    fill(sz,sz+n+1,1);
    dfs_up(1,0);
    vector<vector<int>>adj2(n+1);
    for(int i=1;i<=n;i++){
        for(auto&u:adj[i]){
            if(f(i)!=f(u))adj2[f(i)].push_back(f(u));
        }
    }
    int res=0;
    for(int i=1;i<=n;i++)res+=(adj2[i].size()==1);
    cout<<(res+1)/2;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

mergers.cpp: In function 'int main()':
mergers.cpp:84:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |         for(int j=0;j<state[i].size();j++){
      |                     ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...