제출 #154939

#제출 시각아이디문제언어결과실행 시간메모리
154939MercenaryMergers (JOI19_mergers)C++14
0 / 100
160 ms47092 KiB
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

#define pb push_back
#define mp make_pair
#define taskname "A"

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int maxn = 5e5 + 5;

int n , k , col[maxn];
int total[maxn];
int ans = 0;
vector<int> adj[maxn];
int cnt[maxn];
gp_hash_table<int,int> *s[maxn];
int res[maxn];

int cut[maxn];
int sub[maxn];

void DFS(int u , int par){
    int big = -1;
    sub[u] = 1;
    int have = 0;
    for(int c: adj[u]){
        if(c != par){
            DFS(c , u);
            sub[u] += sub[c];
            have |= cut[c];
            if(big == -1 || sub[big] < sub[c])big = c;
        }
    }
    if(u == 1)return;
    if(big == -1){
        s[u] = new gp_hash_table<int,int>();
    }else{
        s[u] = s[big];
        res[u] = res[big];
    }
    auto add = [&](int col , int num){
        (*s[u])[col] += num;
        res[u] += (*s[u])[col] == total[col];
    };
    add(col[u] , 1);
    for(int c : adj[u]){
        if(c != par && c != big){
            for(auto d : (*s[c])){
                add(d.first , d.second);
            }
        }
    }
    cut[u] = (s[u]->size() == res[u]);
    if(have == 0 && cut[u])ans++;
//    cout << u << " " << have << " " << res[u] << endl;
    cut[u] |= have;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
		freopen(taskname".INP", "r",stdin);
		freopen(taskname".OUT", "w",stdout);
    }
    cin >> n >> k;
    for(int i = 1 ; i < n ; ++i){
        int u , v;cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for(int i = 1 ; i <= n ; ++i){
        cin >> col[i];
        total[col[i]]++;
    }
    DFS(1 , 0);
//    cout << ans;
    cout << (ans + 1) / 2;
}

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

mergers.cpp: In function 'void DFS(int, int)':
mergers.cpp:61:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     cut[u] = (s[u]->size() == res[u]);
               ~~~~~~~~~~~~~^~~~~~~~~
mergers.cpp: In function 'int main()':
mergers.cpp:72:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".INP", "r",stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
mergers.cpp:73:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".OUT", "w",stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...