Submission #882063

#TimeUsernameProblemLanguageResultExecution timeMemory
882063antonLongest beautiful sequence (IZhO17_subsequence)C++17
100 / 100
4564 ms185300 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int, int>

const int MAX_N = 1e5;
const int BAR = 10;
const int MAX_X = 20;
int n;

pii dp[(1<<BAR)][(1<<BAR)][BAR+1], back[MAX_N];
int a[MAX_N], k[MAX_N];

int popcount(int i){
    if(i==0){
        return 0;
    }
    return popcount(i & (i-1)) +1;
}

void display(pii u){
    //cout<<u.first<<" "<<u.second<<endl;
    if(u.second!=-1){
        cout<<u.second+1<<" ";
        display(back[u.second]);    
    }
}

signed main(){

    cin>>n;

    for(int i = 0; i<n; i++){
        cin>>a[i];
    }

    for(int i = 0; i<n; i++){
        cin>>k[i];
    }

    pii ans = pii(0, n-1);
    for(int i = n-1; i>=0; i--){
        pii res =pii(0, -1);
        int right = a[i]%(1<<BAR);
        int left = a[i]>>BAR;

        //cout<<bitset<BAR>(left)<<" "<<bitset<BAR>(right)<<" "<<k[i]<<endl;

        for(int mright = 0; mright<(1<<BAR); mright++){
            int exp_right =popcount(mright&right);
            //cout<<bitset<BAR>(left)<<" "<<bitset<BAR>(mright)<<" "<<exp_right<<"is ok"<<endl;
            if(dp[left][mright][exp_right].first>res.first){
                res= dp[left][mright][exp_right];
            }
        }
        back[i] = res;
        
        res.first+=1;
        res.second = i;

        if(res.first>ans.first){
            ans =res;
        }

        for(int mleft = 0; mleft<(1<<BAR); mleft++){
            int exp_right = k[i]-popcount(mleft&left);
            if(exp_right>=0 && exp_right<=popcount(right)){
                //cout<<"setting "<<bitset<BAR>(mleft)<<" "<<bitset<BAR>(right)<<" "<<exp_right<<endl;
                if(dp[mleft][right][exp_right].first< res.first){
                    dp[mleft][right][exp_right] =  res;
                }
            }
        }
    }


    cout<<ans.first<<endl;
    display(ans);
    cout<<endl;
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...