Submission #885292

#TimeUsernameProblemLanguageResultExecution timeMemory
885292alexddLongest beautiful sequence (IZhO17_subsequence)C++17
100 / 100
2629 ms93776 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...