Submission #1159722

#TimeUsernameProblemLanguageResultExecution timeMemory
1159722jus_tengSeptember (APIO24_september)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h> using namespace std; /*Topological BFS + Binary Search approach Topological BFS adapted from https://cp-algorithms.com/graph/breadth-first-search.html and https://cp-algorithms.com/graph/topological-sort.html Modifications: - Topological DFS changed to topological BFS - Queue and in-degree array instead of recursion - Zero in-degree nodes processed first Binary Search adapted from https://cp-algorithms.com/num_methods/binary_search.html Modifications: - Binary search is used for max possible K days instead of sorted array - Each check does leaf removal through Topological BFS*/ int n, m; vector<vector<int>> adj; vector<int> inDegree; bool topBFS(int k, vector<vector<int>>& s){ queue<int> q; vector<int> remainingInDegree = inDegree; for (int i = 0; i < n; i++){ if (remainingInDegree[i] == 0){ q.push(i); } } int days = 0; int processed = 0; for (int day = 0; day < k; day++){ if (q.empty()){ return false; } vector<int> todayFallen; int size = q.size(); while (size--){ int node = q.front(); q.pop(); todayFallen.push_back(node); processed++; for (int parent : adj[node]){ remainingInDegree[parent]--; if (remainingInDegree[parent] == 0){ q.push(parent); } } } set<int> todaySet(todayFallen.begin(), todayFallen.end()); for (int v = 0; v < m; v++){ int start = (day == 0) ? 0 : (day * (n - 1) / k); int end = min((day + 1) * (n - 1) / k, (int)s[v].size()); for (int i = start; i < end; i++){ if (todaySet.find(s[v][i]) == todaySet.end()){ return false; } } } days++; } return (processed == n - 1); } int binSearch(vector<vector<int>>& s){ int left = 1, right = n - 1, ans = 1; while (left <= right){ int mid = (left + right) / 2; if (topBFS(mid, s)){ ans = mid; left = mid + 1; } else{ right = mid - 1; } } return ans; } int solve(int N, int M, vector<int> F, vector<vector<int>> S){ n = N; m = M; adj.assign(n, vector<int>()); inDegree.assign(n, 0); for (int i = 1; i < n; i++){ int parent = F[i]; adj[parent].push_back(i); inDegree[i]++; } return binSearch(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...