Submission #885291

#TimeUsernameProblemLanguageResultExecution timeMemory
885291alexddLongest beautiful sequence (IZhO17_subsequence)C++17
100 / 100
2846 ms93716 KiB
#include<bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops") 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; } /** 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...