#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |