Submission #501782

#TimeUsernameProblemLanguageResultExecution timeMemory
501782Ronin13Longest beautiful sequence (IZhO17_subsequence)C++14
40 / 100
132 ms4400 KiB
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
#define f first
#define s second
#define pii pair<int,int>
#define inf 1e9+1
#define linf 1e18+1
using namespace std;

void solve(){
    int n;cin>>n;
    if(n<=5000){
    int a[n+1];
    int k[n+1];
    int d[n+1],d1[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>k[i];
    }
    for(int i=1;i<=n;i++){
        d[i]=1;
        d1[i]=-1;
    }
    for(int i=2;i<=n;i++){
        for(int j=i-1;j>=1;j--){
            int x=a[i]&a[j];
            if(__builtin_popcount(x)==k[i]){
                if(d[j]+1>d[i]){
                    d[i]=d[j]+1;
                    d1[i]=j;
                }
            }
        }
    }
    int mx=0,mxi;
    for(int i=1;i<=n;i++){
        if(d[i]>mx){
            mx=d[i];
            mxi=i;
        }
    }
    vector<int>vec;
    while(mxi!=-1){
        vec.pb(mxi);
        mxi=d1[mxi];
    }
    cout<<vec.size()<<"\n";
    reverse(vec.begin(),vec.end());
    for(int to:vec)cout<<to<<' ';
    return;
    }
    int a[n+1];
    int k[n+1];
    int d[n+1],d1[n+1],d2[257];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        d[i]=1;
        d1[i]=-1;
    }
    for(int i=0;i<=256;i++)d2[i]=0;
    for(int i=1;i<=n;i++){
        cin>>k[i];
    }
    d[0]=0;
    d[1]=1,d1[1]=-1,d2[a[1]]=1;
    for(int i=2;i<=n;i++){
        for(int x=0;x<=256;x++){
            int y=x&a[i];
            if(__builtin_popcount(y)==k[i]){
                if(d[d2[x]]+1>d[i])d[i]=d[d2[x]]+1,d1[i]=d2[x];
            }
        }
        if(d[i]>d[d2[a[i]]])d2[a[i]]=i;
    }
    int mx=0,mxi;
    for(int i=1;i<=n;i++){
        if(d[i]>mx){
            mx=d[i];
            mxi=i;
        }
    }
    vector<int>vec;
    while(mxi!=-1){
        vec.pb(mxi);
        mxi=d1[mxi];
    }
    cout<<vec.size()<<"\n";
    reverse(vec.begin(),vec.end());
    for(int to:vec)cout<<to<<' ';
    return;

}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    int test=1;//cin>>test;
    while(test--)solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...