Submission #36145

#TimeUsernameProblemLanguageResultExecution timeMemory
36145user202729Longest beautiful sequence (IZhO17_subsequence)C++14
23 / 100
6000 ms3192 KiB
#include <iostream> #include <vector> #include <algorithm> #pragma uint32_t popcount(uint32_t v) { v = v - ((v >> 1) & 0x55555555u); v = (v & 0x33333333u) + ((v >> 2u) & 0x33333333u); return (((v + (v >> 4u)) & 0xF0F0F0Fu) * 0x1010101u) >> 24u; } int main() { size_t n; std::cin >> n; std::vector<uint32_t> a (n), k (n); for (uint32_t& ai : a) std::cin >> ai; for (uint32_t& ki : k) std::cin >> ki; /// dp[i] = length of longest valid sequence ends at (i) std::vector<int> dp (n, 1); for (size_t i = 1; i < n; ++i) { uint32_t ai = a[i], ki = k[i]; if (popcount(ai) < ki) continue; // failed, dp[i] == 1 int dpi = 0; for (size_t prev = i; prev --> 0;) { if (popcount(a[prev] & ai) == ki) { dpi = std::max(dpi, dp[prev]); } } dp[i] = ++dpi; } auto it = std::max_element(dp.begin(), dp.end()); size_t index = size_t(it - dp.begin()); int value = *it; --value; std::vector<size_t> rev_indices = {index}; while (value != 0) { index = rev_indices.back(); int dp_last_exp = dp[index] - 1; size_t last_index; for (last_index = index; last_index --> 0;) if (dp_last_exp == dp[last_index] && popcount(a[last_index] & a[index]) == k[index]) break; rev_indices.push_back(last_index); --value; } std::cout << *it << '\n'; for (size_t i = rev_indices.size(); i --> 0;) std::cout << -~rev_indices[i] << ' '; } // 4 1 2 3 4 10 0 1 0

Compilation message (stderr)

subsequence.cpp:5:0: warning: ignoring #pragma   [-Wunknown-pragmas]
 #pragma
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...