Submission #824325

#TimeUsernameProblemLanguageResultExecution timeMemory
824325TS_2392Longest beautiful sequence (IZhO17_subsequence)C++14
100 / 100
2499 ms96388 KiB
#include <bits/stdc++.h> #define bp __builtin_popcount using namespace std; const int N = 1e5 + 3; int n, a[N], k[N], f[1024][1024][11], cnt_bit[1 << 20], trace[N]; int res, save, best[1024][1024][11]; //f[mask][v][i] trong nhung day co gia tri cuoi a + v * 2 ^ 10 t/m bp(a & mask) == i thi do day cua day dai nhat la bool maximize(int &a, int b){ if(a < b){ a = b; return true; } return false; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; for(int i = 1; i <= n; ++i) cin >> a[i]; for(int i = 1; i <= n; ++i) cin >> k[i]; for(int i = 0; i < 1 << 20; ++i) cnt_bit[i] = bp(i); for(int i = 1; i <= n; ++i){ int ans = 0; int mask1 = a[i] >> 10; int mask2 = a[i] & 1023; for(int v = 0; v < 1024; ++v){ int need = k[i] - cnt_bit[mask2 & v]; if(need < 0 || need > 10) continue; if(maximize(ans, f[mask1][v][need])) trace[i] = best[mask1][v][need]; } ++ans; if(maximize(res, ans)) save = i; for(int v = 0; v < 1024; ++v) if(maximize(f[v][mask2][cnt_bit[mask1 & v]], ans)){ best[v][mask2][cnt_bit[mask1 & v]] = i; } } cout << res << '\n'; vector<int> res_ind; while(save > 0){ res_ind.push_back(save); save = trace[save]; } for(int i = res_ind.size() - 1; i >= 0; --i) cout << res_ind[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...