Submission #1220265

#TimeUsernameProblemLanguageResultExecution timeMemory
1220265vaneaLongest beautiful sequence (IZhO17_subsequence)C++20
100 / 100
2552 ms96008 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int B = 10;

int bc[1 << B][1 << B];
array<int, 2> dp[1 << B][1 << B][11];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 0; i < (1 << B); i++) {
        for(int j = 0; j < (1 << B); j++) {
            bc[i][j] = __builtin_popcount(i&j);
        }
    }
    vector<int> a(n), k(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i < n; i++) {
        cin >> k[i];
    }
    vector<int> prv(n);
    iota(prv.begin(), prv.end(), 0);
    int ans = 1, best_i = 0;
    for(int i = 0; i < n; i++) {
        int l = a[i] >> B;
        int r = a[i] % (1 << B);
        int lbs = 1;
        for(int j = 0; j < (1 << B); j++) {
            if(k[i] - bc[j][l] < 0 || k[i] - bc[j][l] > B) continue;
            array<int, 2> last = dp[j][r][k[i]-bc[j][l]];
            if(last[0] + 1 > lbs) {
                lbs = last[0]+1;
                prv[i] = last[1];
            }
        }
        if(lbs > ans) {
            ans = lbs;
            best_i = i;
        }
        for(int j = 0; j < (1 << B); j++) {
            array<int, 2> &nxt = dp[l][j][bc[r][j]];
            if(lbs > nxt[0]) {
                nxt[0] = lbs;
                nxt[1] = i;
            }
        }
    }
    cout << ans << '\n';
    vector<int> res;
    while(prv[best_i] != best_i) {
        res.push_back(best_i);
        best_i = prv[best_i];
    }
    res.push_back(best_i);
    reverse(res.begin(), res.end());
    for(auto it : res) {
        cout << it+1 << ' ';
    }
    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...