이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define fi first
#define se second
#define M 10
typedef pair<int, int> ii;
int n, a[N], k[N], cbit[(1 << M) + 1][(1 << M) + 1], par[N];
ii dp[(1 << M) + 1][(1 << M) + 1][M + 1];
int get(int msk){
int rt = 0;
for (int pos = 0; pos < M; pos++) rt += (msk >> pos) & 1;
return rt;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int j = 1; j <= n; j++) cin >> k[j];
for (int msk = 0; msk < 1 << M; msk++){
for (int msk2 = 0; msk2 < 1 << M; msk2++){
int cur = msk & msk2;
cbit[msk][msk2] = get(cur);
}
}
ii res = {0, 0};
for (int i = 1; i <= n; i++){
ii best = {0, 0};
int l = a[i] >> M;
int r = a[i] % (1 << M);
for (int msk = 0; msk < 1 << M; msk++){
int cal = k[i] - cbit[l][msk];
if (cal < 0 || cal > M) continue;
if (dp[msk][r][cal].fi > best.fi){
best = dp[msk][r][cal];
}
}
best.fi++;
par[i] = best.se;
best.se = i;
for (int msk = 0; msk < 1 << M; msk++){
int cur = cbit[msk][r];
if (cur < 0 || cur > M) continue;
if (dp[l][msk][cur].fi < best.fi){
dp[l][msk][cur] = best;
}
}
res = max(res, best);
}
vector<int> ans;
int pos = res.se;
while (pos){
ans.push_back(pos);
pos = par[pos];
}
cout << ans.size() << "\n";
for (int i = (int) ans.size() - 1; i >= 0; i--) cout << ans[i] << " " ;
return 0;
}
| # | 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... |