Submission #1307202

#TimeUsernameProblemLanguageResultExecution timeMemory
13072021anLongest beautiful sequence (IZhO17_subsequence)C++20
100 / 100
3122 ms137304 KiB
#include <bits/stdc++.h> using namespace std; struct state { int len, end; }; int main () { int n; cin >> n; vector<int> a(n), k(n), prev(n); for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { cin >> k[i]; prev[i] = i; } vector<int> l(1 << 20), r(1 << 20); for (int i = 0; i < (1 << 20); i++) { r[i] = i >> 10; l[i] = i & ((1 << 10) - 1); } vector<vector<int>> bc(1 << 10, vector<int>(1 << 10)); for (int i = 0; i < (1 << 10); i++) for (int j = 0; j < (1 << 10); j++) bc[i][j] = __builtin_popcount(i & j); int ans = 1, m_idx = 0; vector<vector<vector<state>>> dp(1 << 10, vector<vector<state>>(1 << 10, vector<state>(11))); for (int i = 0; i < n; i++) { int cn = a[i]; int right = l[cn]; int left = r[cn]; int lbs = 1; for (int pn = 0; pn < (1 << 10); pn++) { int needed = k[i] - bc[left][pn]; if (needed < 0 || needed > 10) continue; if (dp[pn][right][needed].len + 1 > lbs) { lbs = dp[pn][right][needed].len + 1; prev[i] = dp[pn][right][needed].end; } } if (lbs > ans) { ans = lbs; m_idx = i; } for (int pn = 0; pn < (1 << 10); pn++) { if (lbs > dp[left][pn][bc[right][pn]].len) { dp[left][pn][bc[right][pn]] = {lbs, i}; } } } printf("%d\n", ans); stack<int> st; while (true) { st.push(m_idx); if (prev[m_idx] == m_idx) break; m_idx = prev[m_idx]; } while (!st.empty()) { printf("%d ", st.top() + 1); st.pop(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...