Submission #881982

#TimeUsernameProblemLanguageResultExecution timeMemory
881982antonLongest beautiful sequence (IZhO17_subsequence)C++17
7 / 100
241 ms166484 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> const int MAX_N = 1e5; const int BAR = 10; const int MAX_X = 20; int n; pii dp[(1<<BAR)][(1<<BAR)][BAR], back[MAX_N]; int a[MAX_N], k[MAX_N]; int popcount(int i){ if(i==0){ return 0; } return popcount(i & (i-1)) +1; } void display(pii u){ //cout<<u.first<<" "<<u.second<<endl; if(u.second!=-1){ cout<<u.second+1<<" "; display(back[u.second]); } } signed main(){ cin>>n; for(int i = 0; i<n; i++){ cin>>a[i]; } for(int i = 0; i<n; i++){ cin>>k[i]; } pii ans = pii(0, n-1); for(int i = n-1; i>=0; i--){ pii res =pii(0, -1); int right = a[i]%(1<<BAR); int left = a[i]>>BAR; //cout<<bitset<BAR>(left)<<" "<<bitset<BAR>(right)<<" "<<k[i]<<endl; for(int mright = 0; mright<(1<<BAR); mright++){ int exp_right =popcount(mright&right); //cout<<bitset<BAR>(left)<<" "<<bitset<BAR>(mright)<<" "<<exp_right<<"is ok"<<endl; if(dp[left][mright][exp_right].first>res.first){ res= max(res, dp[left][mright][exp_right]); } } res.first+=1; back[i] = res; //cout<<i<<" "<<res.first<<" "<<res.second<<endl; res.second = i; ans = max(ans, res); for(int mleft = 0; mleft<(1<<BAR); mleft++){ int exp_right = k[i]-popcount(mleft&left); if(exp_right>=0 && exp_right<=popcount(right)){ //cout<<"setting "<<bitset<BAR>(mleft)<<" "<<bitset<BAR>(right)<<" "<<exp_right<<endl; dp[mleft][right][exp_right] = max(dp[mleft][right][exp_right], res); } } } cout<<ans.first<<endl; display(ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...