제출 #766206

#제출 시각아이디문제언어결과실행 시간메모리
766206vjudge1Longest beautiful sequence (IZhO17_subsequence)C++17
0 / 100
51 ms94684 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]; int ans = 1, pos = 0; 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) { s.push(pos); pos = pre[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...