제출 #1204483

#제출 시각아이디문제언어결과실행 시간메모리
1204483Trn115파일 삭제 (GA3_delete)C++20
75 / 120
143 ms327680 KiB
#include <bits/stdc++.h> #define fi first #define se second #define all(x) x.begin(), x.end() using namespace std; constexpr int inf = 1e9; int DeletePlan( int N, int M, int K, int *A, int *B) { int n = N + M; vector<vector<int>> g(n); for (int i = 0; i < N; ++i) { g[A[i] + N].push_back(i); } for (int i = 1; i < M; ++i) { g[B[i] + N].push_back(i + N); } vector<int> num(n), tail(n), euler(n + 1); vector<vector<int>> back(n + 1); int timer = 0; function<void(int)> dfs = [&](int v) { num[v] = tail[v] = ++timer; euler[timer] = v; for (int u : g[v]) dfs(u); tail[v] = timer; back[tail[v]].push_back(num[v]); }; dfs(N); vector<int> pref(n + 1); for (int i = 1; i <= n; ++i) pref[i] = pref[i - 1] + (euler[i] < N); vector<vector<int>> dp(n + 1, vector<int>(K + 1, inf)); for (int i = 0; i <= n; ++i) dp[i][0] = 0; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= K; ++j) { dp[i][j] = dp[i - 1][j]; for (int x : back[i]) { int val = pref[i] - pref[x - 1]; if (val > j) continue; dp[i][j] = min(dp[i][j], dp[x - 1][j - val] + 1); } } } return dp[n][K]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...