This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int N = 100'000 + 10;
int n;
int a[N], k[N];
int f[N], trace[N], d[N];
int main(){
cin.tie(0)->sync_with_stdio(0);
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 = 1; i <= n; ++i){
auto& ret = f[i]; ret = 1;
if (k[i] <= __builtin_popcount(a[i])) {
for (int j = i - 1; j && d[j] + 1 > ret; --j)
if (__builtin_popcount(a[i] & a[j]) == k[i] && f[j] + 1 > ret) ret = f[trace[i] = j] + 1;
}
d[i] = max(d[i - 1], ret);
}
int it = 0;
for (int i = 1; i <= n; ++i) if (f[i] > f[it]) it = i;
vector<int> answer;
while (it) {
answer.push_back(it);
it = trace[it];
}
reverse(answer.begin(), answer.end());
cout << answer.size() << "\n";
for (const auto& x : answer) cout << x << " \n"[x == answer.end()[-1]];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |