Submission #766212

#TimeUsernameProblemLanguageResultExecution timeMemory
766212vjudge1Longest beautiful sequence (IZhO17_subsequence)C++17
100 / 100
2517 ms96976 KiB
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cctype> #include <iomanip> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <cstdlib> #include <bitset> #include <deque> #define inf 0x3f3f3f3f #define infll 0x3f3f3f3f3f3f3f3fll using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 100005; const int B = 10; struct state { int len, end; state() { len = end = 0; } } dp[1 << B][1 << B][B + 1]; int bc[1 << B][1 << B]; int a[maxn], k[maxn], pre[maxn]; int n; int main() { for (int i = 0; i < (1 << B); i++) { for (int j = 0; j < (1 << B); j++) { bc[i][j] = __builtin_popcount(i & j); } } cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> k[i]; for (int i = 1; i <= n; i++) pre[i] = i; int ans = 1, pos = 1; for (int i = 1; i <= n; i++) { int l = a[i] >> B, r = a[i] % (1 << B); int len = 1; for (int j = 0; j < (1 << B); j++) { int rest = k[i] - bc[l][j]; if (rest < 0 || rest > B) continue; if (len < dp[j][r][rest].len + 1) { len = dp[j][r][rest].len + 1; pre[i] = dp[j][r][rest].end; } } if (len > ans) { ans = len; pos = i; } for (int j = 0; j < (1 << B); j++) { if (dp[l][j][bc[r][j]].len < len) { dp[l][j][bc[r][j]].len = len; dp[l][j][bc[r][j]].end = i; } } } cout << ans << endl; stack<int> s; while (pos != pre[pos]) { s.push(pos); pos = pre[pos]; } s.push(pos); while (!s.empty()) { cout << s.top() << " "; s.pop(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...