Submission #885288

#TimeUsernameProblemLanguageResultExecution timeMemory
885288alexddLongest beautiful sequence (IZhO17_subsequence)C++17
100 / 100
4549 ms94560 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];
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[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] - __builtin_popcount(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][__builtin_popcount(nri&curri)]])
            {
                ult[curle][nri][__builtin_popcount(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;
}
/**

4
1 2 3 4
10 0 1 0

2
8 9
20 0

5
5 3 5 3 5
10 1 20 1 20

ult[maskle][maskri][cnt] = lungimea maxima a unei secvente care se termina cu un element care are partea din stanga egala cu maskle si caruia,
                          daca ii combinam partea dreapta cu maskri, o sa avem cnt pozitii


*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...