답안 #227198

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
227198 2020-04-26T13:06:46 Z MKopchev Mergers (JOI19_mergers) C++14
0 / 100
75 ms 18960 KB
#include <bits/stdc++.h>
using namespace std;

const int nmax=5e5+42;

int n,k;

int colour[nmax],cnt[nmax];

vector<int> adj[nmax];

int wrong=0;

int seen[nmax];

void add(int val)
{
    val=colour[val];

    if(seen[val]==0)wrong++;
    seen[val]++;
    if(seen[val]==cnt[val])wrong--;
}

void sub(int val)
{
    val=colour[val];

    if(seen[val]==cnt[val])wrong++;
    seen[val]--;
    if(seen[val]==0)wrong--;
}

int SZ[nmax];

void dfs_sz(int node,int par)
{
    SZ[node]=1;
    for(auto k:adj[node])
        if(k!=par)
        {
            dfs_sz(k,node);
            SZ[node]+=SZ[k];
        }
}

int can_divide=0;

void dfs_clean(int node,int par)
{
    sub(node);

    for(auto k:adj[node])
        if(k!=par)
        {
            dfs_clean(k,node);
        }
}

void dfs_add(int node,int par)
{
    add(node);

    for(auto k:adj[node])
        if(k!=par)
        {
            dfs_add(k,node);
        }
}
int dfs(int node,int par)
{
    bool found=0;

    int big=0;

    for(auto k:adj[node])
        if(k!=par&&SZ[big]<SZ[k])big=k;

    for(auto k:adj[node])
        if(k!=par&&big!=k)
        {
            found=dfs(k,node)|found;

            dfs_clean(k,node);
        }
    /*
    cout<<node<<" -> "<<big<<" "<<found<<" "<<wrong<<endl;

    cout<<"seen(should be empty): ";for(int i=1;i<=k;i++)cout<<seen[i]<<" ";cout<<endl;
    */
    if(big)found=found|dfs(big,node);


    for(auto k:adj[node])
        if(k!=par&&big!=k)
            dfs_add(k,node);

    add(node);

    //cout<<node<<" -> "<<big<<" "<<found<<" "<<wrong<<endl;

    //cout<<"seen: ";for(int i=1;i<=k;i++)cout<<seen[i]<<" ";cout<<endl;

    if(wrong==0&&found==0&&node!=1)
    {
        found=1;
        can_divide++;
    }
    return found;
}
int main()
{
    scanf("%i%i",&n,&k);

    int u,v;
    for(int i=1;i<n;i++)
    {
        scanf("%i%i",&u,&v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    for(int i=1;i<=n;i++)
    {
        scanf("%i",&colour[i]);
        cnt[colour[i]]++;
    }

    dfs_sz(1,0);

    dfs(1,0);

    printf("%i\n",(can_divide+1)/2);

    return 0;
}

Compilation message

mergers.cpp: In function 'int main()':
mergers.cpp:113:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i%i",&n,&k);
     ~~~~~^~~~~~~~~~~~~~
mergers.cpp:118:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i%i",&u,&v);
         ~~~~~^~~~~~~~~~~~~~
mergers.cpp:125:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i",&colour[i]);
         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 12032 KB Output is correct
2 Correct 11 ms 12032 KB Output is correct
3 Correct 11 ms 12032 KB Output is correct
4 Correct 11 ms 12032 KB Output is correct
5 Correct 11 ms 12032 KB Output is correct
6 Correct 11 ms 12160 KB Output is correct
7 Correct 11 ms 12160 KB Output is correct
8 Correct 11 ms 12032 KB Output is correct
9 Correct 11 ms 12160 KB Output is correct
10 Correct 19 ms 12032 KB Output is correct
11 Correct 11 ms 12160 KB Output is correct
12 Correct 11 ms 12160 KB Output is correct
13 Correct 11 ms 12160 KB Output is correct
14 Correct 11 ms 12032 KB Output is correct
15 Correct 11 ms 12160 KB Output is correct
16 Incorrect 11 ms 12032 KB Output isn't correct
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 12032 KB Output is correct
2 Correct 11 ms 12032 KB Output is correct
3 Correct 11 ms 12032 KB Output is correct
4 Correct 11 ms 12032 KB Output is correct
5 Correct 11 ms 12032 KB Output is correct
6 Correct 11 ms 12160 KB Output is correct
7 Correct 11 ms 12160 KB Output is correct
8 Correct 11 ms 12032 KB Output is correct
9 Correct 11 ms 12160 KB Output is correct
10 Correct 19 ms 12032 KB Output is correct
11 Correct 11 ms 12160 KB Output is correct
12 Correct 11 ms 12160 KB Output is correct
13 Correct 11 ms 12160 KB Output is correct
14 Correct 11 ms 12032 KB Output is correct
15 Correct 11 ms 12160 KB Output is correct
16 Incorrect 11 ms 12032 KB Output isn't correct
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 12032 KB Output is correct
2 Correct 11 ms 12032 KB Output is correct
3 Correct 11 ms 12032 KB Output is correct
4 Correct 11 ms 12032 KB Output is correct
5 Correct 11 ms 12032 KB Output is correct
6 Correct 11 ms 12160 KB Output is correct
7 Correct 11 ms 12160 KB Output is correct
8 Correct 11 ms 12032 KB Output is correct
9 Correct 11 ms 12160 KB Output is correct
10 Correct 19 ms 12032 KB Output is correct
11 Correct 11 ms 12160 KB Output is correct
12 Correct 11 ms 12160 KB Output is correct
13 Correct 11 ms 12160 KB Output is correct
14 Correct 11 ms 12032 KB Output is correct
15 Correct 11 ms 12160 KB Output is correct
16 Incorrect 11 ms 12032 KB Output isn't correct
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 17888 KB Output is correct
2 Incorrect 73 ms 18960 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 12032 KB Output is correct
2 Correct 11 ms 12032 KB Output is correct
3 Correct 11 ms 12032 KB Output is correct
4 Correct 11 ms 12032 KB Output is correct
5 Correct 11 ms 12032 KB Output is correct
6 Correct 11 ms 12160 KB Output is correct
7 Correct 11 ms 12160 KB Output is correct
8 Correct 11 ms 12032 KB Output is correct
9 Correct 11 ms 12160 KB Output is correct
10 Correct 19 ms 12032 KB Output is correct
11 Correct 11 ms 12160 KB Output is correct
12 Correct 11 ms 12160 KB Output is correct
13 Correct 11 ms 12160 KB Output is correct
14 Correct 11 ms 12032 KB Output is correct
15 Correct 11 ms 12160 KB Output is correct
16 Incorrect 11 ms 12032 KB Output isn't correct
17 Halted 0 ms 0 KB -