Submission #1198562

#TimeUsernameProblemLanguageResultExecution timeMemory
1198562SnowRaven52Longest beautiful sequence (IZhO17_subsequence)C++20
100 / 100
2181 ms95976 KiB
#include <bits/stdc++.h> using namespace std; const int B = 10; const int M = 1 << B; struct state { int length = 0; int last_idx = -1; }; int main(){ int bc[M][M]; for(int i = 0; i < M; ++i) for(int j = 0; j < M; ++j) bc[i][j] = __builtin_popcount(i & j); int n; cin >> n; vector<int> a(n), k(n); for(int &x : a) cin >> x; for(int &x : k) cin >> x; state dp[M][M][B+1]; int best_len = 1, best_end = 0; vector<int> prev_idx(n); iota(prev_idx.begin(), prev_idx.end(), 0); for(int i = 0; i < n; ++i) { int hi = a[i] >> B, lo = a[i] & (M - 1), cur_len = 1, cur_prev = i; for(int prev_hi = 0; prev_hi < M; ++prev_hi) { int needed = k[i] - bc[prev_hi][hi]; if(needed < 0 || needed > B) continue; auto &st = dp[prev_hi][lo][needed]; if(st.length + 1 > cur_len) { cur_len = st.length + 1; cur_prev = st.last_idx; } } prev_idx[i] = cur_prev; if(cur_len > best_len) { best_len = cur_len; best_end = i; } for(int next_lo = 0; next_lo < M; ++next_lo) { int c = bc[lo][next_lo]; auto &st = dp[hi][next_lo][c]; if(cur_len > st.length) { st.length = cur_len; st.last_idx = i; } } } vector<int> sequence; for(int x = best_end; prev_idx[x] != x; x = prev_idx[x]) sequence.push_back(x); sequence.push_back(sequence.empty() ? best_end : prev_idx[sequence.back()]); reverse(sequence.begin(), sequence.end()); cout << best_len << endl; for(int idx : sequence) cout << idx + 1 << " "; cout << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...