제출 #1159690

#제출 시각아이디문제언어결과실행 시간메모리
1159690ProtonDecay3149월 (APIO24_september)C++20
100 / 100
78 ms9620 KiB
#include "september.h" #include<bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pi; typedef vector<pi> vpi; #define pb push_back vi invert(const vi& a) { int n = a.size(); n++; vi inv(n, 0); for(int i = 0; i < n - 1; i++) { inv[a[i]] = i; } return inv; } int solve(int N, int M, vi F, vvi S) { vvi sinv; for(int i = 0; i < M; i++) { sinv.pb(invert(S[i])); } vpi consts; // Constraints across entries for(int i = 1; i < N; i++) { int mn = N, mx = 0; for(int j = 0; j < M; j++) { mn = min(mn, sinv[j][i]); mx = max(mx, sinv[j][i]); } consts.pb({mn, mx}); } // Tree constraints for(int i = 1; i < N; i++) { // i is cur node int par = F[i]; // par is parent // par must be to the right of i // otherwise we have a constraint if(par == 0) continue; for(int j = 0; j < M; j++) { if(sinv[j][par] < sinv[j][i]) consts.pb({sinv[j][par], sinv[j][i]}); } } // Solving the constraints vi to_add(N - 1, 0); for(auto [in, out] : consts) { to_add[in]++; to_add[out]--; } int cursum = 0; int ans = 0; for(int i = 0; i < N - 1; i++) { cursum += to_add[i]; // cerr << cursum << " "; if(cursum == 0) ans++; } // cerr << endl; return ans; }
#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...