This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int k[100005];
int prec[100005];
int dp[100005];
int ult[1030][1030][22];
int pre1[1030];
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=0;i<(1<<10);i++)
pre1[i] = __builtin_popcount(i);
int mxm=0,unde=-1;
for(int i=1;i<=n;i++)
{
cin>>k[i];
dp[i] = 1;
prec[i] = -1;
int curle = (a[i]&((1<<10)-1));
int curri = ((a[i]-curle)>>10);
for(int ule=0;ule<(1<<10);ule++)
{
int r = k[i] - pre1[ule&curle];
if(dp[i] < dp[ult[ule][curri][r]]+1)
{
prec[i] = ult[ule][curri][r];
dp[i] = dp[prec[i]]+1;
}
}
for(int nri=0;nri<(1<<10);nri++)
if(dp[i] > dp[ult[curle][nri][pre1[nri&curri]]])
ult[curle][nri][pre1[nri&curri]] = i;
if(dp[i]>mxm)
{
mxm=dp[i];
unde=i;
}
}
vector<int> sol;
while(unde!=-1)
{
sol.push_back(unde);
unde = prec[unde];
}
cout<<sol.size()<<"\n";
for(int i=(int)sol.size()-1;i>=0;i--)
cout<<sol[i]<<" ";
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... |