Submission #477532

#TimeUsernameProblemLanguageResultExecution timeMemory
477532nicolaalexandraCats or Dogs (JOI18_catdog)C++14
38 / 100
3078 ms7972 KiB
#include <bits/stdc++.h>
#include "catdog.h"
#define DIM 100010
using namespace std;

vector <int> L[DIM],a,b;
int v[DIM],dp[DIM][3];
int n,i,q,tip,x;


void initialize(int _n, vector<int> A, vector<int> B) {
    n = _n;
    for (int i=0;i<n-1;i++){
        L[A[i]].push_back(B[i]);
        L[B[i]].push_back(A[i]);
    }
}

void dfs (int nod, int tata){

    int ok = 0;
    for (auto vecin : L[nod])
        if (vecin != tata){
            ok = 1;
            dfs (vecin,nod);
        }

    if (!ok){

        if (v[nod] == 1)
            dp[nod][0] = dp[nod][2] = 1;
        if (v[nod] == 2)
            dp[nod][0] = dp[nod][1] = 1;

    } else {


        if (!v[nod]){ /// nu am nimic in nod

            for (auto vecin : L[nod]){
                if (vecin == tata)
                    continue;

                dp[nod][0] += min(dp[vecin][0],min(dp[vecin][1]+1,dp[vecin][2]+1));

                dp[nod][1] += min (dp[vecin][1],min(dp[vecin][0],dp[vecin][2]+1));

                dp[nod][2] += min (dp[vecin][2],min(dp[vecin][0],dp[vecin][1]+1));

            }

        } else {
            if (v[nod] == 1){ /// cat

                dp[nod][0] = dp[nod][2] = 1;
                for (auto vecin : L[nod]){
                    if (vecin == tata)
                        continue;

                    int val = min (dp[vecin][0],min(dp[vecin][1],dp[vecin][2]+1));

                    dp[nod][0] += val;
                    dp[nod][1] += val;
                    dp[nod][2] += val;

                }


            } else { /// dog

                dp[nod][0] = dp[nod][1] = 1;
                for (auto vecin : L[nod]){
                    if (vecin == tata)
                        continue;

                    int val = min (dp[vecin][0],min(dp[vecin][2],dp[vecin][1]+1));

                    dp[nod][0] += val;
                    dp[nod][1] += val;
                    dp[nod][2] += val;
                }

            }

        }

    }

}


int cat(int x) {
    v[x] = 1;

    memset (dp,0,sizeof dp);


    dfs (1,0);

    return min (dp[1][0],min(dp[1][1],dp[1][2]));
}

int dog(int x) {
    v[x] = 2;

    memset (dp,0,sizeof dp);

    dfs (1,0);

    return min (dp[1][0],min(dp[1][1],dp[1][2]));
}

int neighbor(int x) {
    v[x] = 0;

    memset (dp,0,sizeof dp);

    dfs (1,0);

    return min (dp[1][0],min(dp[1][1],dp[1][2]));
}

/*
int main (){

    ifstream cin ("date.in");
    ofstream cout ("date.out");


    cin>>n;
    for (i=0;i<n-1;i++){
        int x,y;
        cin>>x>>y;
        a.push_back(x);
        b.push_back(y);
        //cin>>a[i]>>b[i];
    }

    initialize(n,a,b);

    cin>>q;
    for (;q--;){
        cin>>tip>>x;
        if (tip == 1)
            cout<<cat(x)<<"\n";
        else {
            if (tip == 2)
                cout<<dog(x)<<"\n";
            else cout<<neighbor(x)<<"\n";
        }
    }



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