Submission #1177544

#TimeUsernameProblemLanguageResultExecution timeMemory
1177544AlgorithmWarriorLongest beautiful sequence (IZhO17_subsequence)C++20
100 / 100
1800 ms55396 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=1e5+5;
int len[MAX],bef[MAX];
int dp[1<<10][1<<10][13];
int n;
int v[MAX];
int comun[MAX];

void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i)
        cin>>v[i];
    for(i=1;i<=n;++i)
        cin>>comun[i];
}

void get_dp(){
    int i;
    for(i=1;i<=n;++i){
        int nr1=(v[i]>>10);
        int nr2=(v[i]^(nr1<<10));
        int nr;
        int best=0;
        for(nr=0;nr<(1<<10);++nr){
            int nrb=__builtin_popcount(nr&nr1);
            if(nrb<=comun[i] && comun[i]-nrb<=10){
                int cand=dp[nr][nr2][comun[i]-nrb];
                if(len[best]<len[cand])
                    best=cand;
            }
        }
        len[i]=len[best]+1;
        bef[i]=best;
        for(nr=0;nr<(1<<10);++nr){
            int nrb=__builtin_popcount(nr&nr2);
            if(len[i]>len[dp[nr1][nr][nrb]])
                dp[nr1][nr][nrb]=i;
        }
    }
}

void write(){
    int best=0;
    int i;
    for(i=1;i<=n;++i)
        if(len[i]>len[best])
            best=i;
    cout<<len[best]<<'\n';
    vector<int>ans;
    while(best){
        ans.push_back(best);
        best=bef[best];
    }
    reverse(ans.begin(),ans.end());
    for(auto ind : ans)
        cout<<ind<<' ';
}

int main()
{
    read();
    get_dp();
    write();
    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...