Submission #226027

#TimeUsernameProblemLanguageResultExecution timeMemory
226027emil_physmathLongest beautiful sequence (IZhO17_subsequence)C++17
0 / 100
137 ms262152 KiB
#include <algorithm> #include <iostream> #include <queue> #include <vector> #include <set> using namespace std; #define Bits __builtin_popcount using uint = unsigned int; const int maxN = 100'000; struct DP { int ind, len, prev; DP(int ind_ = -1, int len_ = 0, int prev_ = -1) : ind(ind_) , len(len_) , prev(prev_) {} operator int&() { return len; } operator const int&() const { return len; } }; inline void Upd(DP& a, const DP& rhs) { if (rhs + 1 >= a) { a.len = rhs.len + 1; a.prev = rhs.ind; } } DP best[1 << 10][1 << 10][21]; DP dp[maxN]; int a[maxN], k[maxN]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < n; ++i) cin >> k[i]; for (int i = 0; i < n; ++i) { dp[i].ind = i; if (i == 0) dp[i].len = 1, dp[i].prev = -1; else for (uint lmask = 0; lmask < (1 << 10); ++lmask) { int lk = Bits(a[i] & (lmask << 10)); if (lk > k[i]) continue; uint rpart = (1 << 10) - 1; rpart &= a[i]; Upd(dp[i], best[lmask][rpart][k[i] - lk]); } uint lpart = (1 << 10) - 1; lpart <<= 10; lpart &= a[i]; for (uint mask = 0; mask < (1 << 10); ++mask) { DP& bst = best[lpart][mask][Bits(a[i] & mask)]; if (bst.len <= dp[i].len) bst = dp[i]; } #ifdef MANSON cerr << "dp[" << dp[i].ind << "] = " << dp[i].len << ", prev: " << dp[i].prev << '\n'; #endif } vector<int> ans; for (int i = max_element(dp, dp + n) - dp; i != -1; i = dp[i].prev) ans.push_back(i); cout << ans.size() << '\n'; reverse(ans.begin(), ans.end()); for (int i: ans) cout << i + 1 << ' '; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...