Submission #852784

#TimeUsernameProblemLanguageResultExecution timeMemory
852784tien9d2Longest beautiful sequence (IZhO17_subsequence)C++14
100 / 100
2559 ms101960 KiB
// Don't look at my code, you will be addicted!

#include <bits/stdc++.h>
#define ii pair <int, int>
#define F first
#define S second

using namespace std;

const int mod = 1e9 + 7;
const int N = 1e5 + 5;
const int M = 1026;

int dp[N], res[M][M][24], trace[N], bitcount[M];
int n, a[N];

void mush(int i, int t){
    if (dp[i] < dp[t] + 1){
        dp[i] = dp[t] + 1;
        trace[i] = t;
    }
}

void truyvet(int i){
    if (i == 0) return;
    truyvet(trace[i]);
    cout << i << ' ';
}

void solve(){
    cin >> n;
    for (int i = 1; i <= n; ++ i) cin >> a[i];

    int lm = 1024;
    for (int i = 0; i < 1024; ++ i){
        for (int j = 0; j < 10; ++ j) bitcount[i] += ((i >> j) & 1);
    }

    int mx = 0;
    for (int i = 1; i <= n; ++ i){
        int k; cin >> k;
        int lft = a[i] >> 10;
        int rg = ((1 << 10) - 1) & a[i];
        for (int j = 0; j < lm; ++ j){
            int val = bitcount[lft & j];
            if (val > k) continue;
            int t = res[j][rg][k - val];
            mush(i, t);
        }

        for (int j = 0; j < lm; ++ j){
            int val = bitcount[rg & j];
            if (dp[i] > dp[res[lft][j][val]]) res[lft][j][val] = i;
        }

        mx = max(mx, dp[i]);
    }


    cout << mx << '\n';
    for (int i = n; i >= 1; -- i){
        if (dp[i] == mx){
            truyvet(i);
            break;
        }
    }
}

int main(){
    //freopen("code.inp", "r", stdin);
    //freopen("code.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t --) solve();

    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...