Submission #1158029

#TimeUsernameProblemLanguageResultExecution timeMemory
1158029cleversquidSeptember (APIO24_september)C++17
0 / 100
1 ms396 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <unordered_set>


using namespace std;

/*
N = Number of Nodes
M = Number of Volunteers
F = Represents the Graph (F[i] = parent of node i)
S = M arrays, each one representing the Volunteer's record
*/


/*When you wake up tomorrow:
Insert printsets for debugging and check final iteration
*/

void printSet(const unordered_set<int>& uset) {
    cout << "\tCurrent Unordered Set:\n\t";
    for (int elem : uset) {
        cout << elem << " ";
    }
    cout << "\n";
}


void dfs(int start, vector<bool> &visited, vector<vector<int> > &children, int &ctr){
    //adjacency list not needed because children is the adjacency list LOL
    if(visited[start] == true){
        return;
    }

    visited[start] = true;

    for(int neighbours: children[start]){
        if(!visited[neighbours]){
            children[start].push_back(neighbours);
            //keep track of number of 
            ctr++;
            dfs(neighbours, visited, children, ctr);
        }
    }
}


//each item in the vector represents the NUMBER OF CHILDREN THAT NODE HAS



int solve(int N, int M, vector<int> F, vector<vector<int> > S){
    //cout << F[0] << " " << S[0][0] << "\n";
    
    /*Generate adjacency list*/
    
    vector<vector<int> > children(N);

    for(int i = 1; i<N; i++){
        children[F[i]].push_back(i);
    }

    //PRINT OUT ALL CHILDREN

    int answer = 0;
    int ctr = 0;

    unordered_set<int> anticipated;
    vector<int> counters(N+5, 0);
    vector<bool> visited(N+5, false);

    for(int i = 0; i<N-1; i++){  
        //cout << "ITERATION " << i << ": \n"; 

        for(int j = 0; j<M; j++){
            //cout << "\tChecking element " << S[j][i] << "..\n";
            //cout << "---\n";
            anticipated.insert(S[j][i]);
            /*cout << "\n---\tCOUNTERS LIST: \n";
            for(int i =  0; i<N; i++){
                cout << counters[i] << " ";
            }
            cout << "\n---\tVISITED LIST: \n";
            for(int i =  0; i<N; i++){
                cout << visited[i] << " ";
            }*/
            
            
            //cout << "\t* ADDING: " << S[j][i] << "\n";
            //printSet(anticipated);

            int element = S[j][i];

            //
            if(visited[element] == false){
                //cout << "\t1. This element has not been visited yet, but has already been MARKED OTHERWISE with +1\n";
                visited[element] = true;
                counters[element]++;

                dfs(element, visited, children, ctr);

                //i forgot DFS was a thing and tried doing an iterative thing :penchickdead:
                /*for(int k = 0; k<children[element].size(); k++){

                    //children[element][k] = within a specific element, kth index across iteration
                    int child = children[element][k];
                    anticipated.insert(child);

                    if(visited[child] == false){

                        //make sure the 
                        cout << "\t2." << k+1 << " The child, " << children[element][k] << ", hasn't been visited and has already been MARKED OTHERWISE with +1.\n";
                        visited[child] = true;
                    }
                    else{
                        cout << "\t2." << k+1 << " The child, " << children[element][k] << ", has been visited already and is ignored.\n";
                    }
                }*/
            }
            else{
                counters[element]++;
            }

            if(counters[element] >= M){
                //cout << "\t!!!. ELEMENT HAS REACHED MAX COUNT, TO BE ERASED IN SET...\n";
                anticipated.erase(element);
            }
        }   



        if(anticipated.size() == 0){
            //cout << "\t!!!. A DAY HAS BEEN COMPLETED, RESETTING...\n";
            answer++;

            anticipated.clear();
            counters.assign(N+5, false);
        }
    }



    //anticipate and un-ancitipate

    //perform DFS for children

    return answer;
}




/*int main(){
    //delete when done
    int N, M;
    cin >> N >> M;
    
    vector<int> F;
    vector<vector<int> > S(M, vector<int>(N-1));

    for(int i = 0; i<=N-1; i++){
        int x;
        cin >> x;
        F.push_back(x);
    }

    for(int i = 0; i<M; i++){
        for(int j = 0; j<N-1; j++){
            int x;
            cin >> x;
            S[i][j] = x;
        }
    }

    cout << "\n";

    for(int i = 0; i<M; i++){
        for(int j = 0; j<N-1; j++){
            cout << S[i][j] << " ";
        }
        cout << "\n";
    }





    cout << solve(N, M, F, S);
}*/

#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...
#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...