제출 #703887

#제출 시각아이디문제언어결과실행 시간메모리
703887DenkataLongest beautiful sequence (IZhO17_subsequence)C++14
100 / 100
3686 ms93084 KiB
#include<bits/stdc++.h>
using namespace std;
const int M = (1<<10);
const int maxn = 1e5+3;
int i,j,p,q,n,m,a[maxn],k[maxn],previous[maxn];
pair<int,int> dp[M][M][11],ans;///fixed (previous) left half,(current) right half, number of bits for & with the right half
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<=n;i++)
        cin>>k[i];
    for(i=1;i<=n;i++)
    {
        pair <int,int> cur={0,0};
        int left = (a[i]>>10);
        int right = (a[i]&((1<<10)-1));
        for(j=0;j<M;j++)
        {
            int ost = k[i]-__builtin_popcount(j&left);
            if(ost<0 || ost>10)continue;
            cur = max(cur,dp[j][right][ost]);
        }
        cur.first++;
        previous[i] = cur.second;
        cur.second = i;
        ans=max(ans,cur);
        for(int j=0;j<M;j++)
        {
            p = __builtin_popcount(j&right);
            dp[left][j][p]=max(cur,dp[left][j][p]);
        }
    }
    cout<<ans.first<<endl;
    p=ans.second;
    stack <int> s;
    while(p>0)
    {
        s.push(p);
        p=previous[p];
    }
    while(!s.empty())
    {
        cout<<s.top()<<" ";
        s.pop();
    }
    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...