이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define task ""
#define fi first
#define se second
#define MASK(i) (1 << (i))
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define BIT(mask, i) ((mask) >> (i) & 1)
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define FORD(i, a, b) for (int i = (b), _a = (a); i >= _a; --i)
template <typename T1, typename T2> bool minimize(T1 &a, T2 b) {
if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b) {
if (a < b) {a = b; return true;} return false;
}
const int dx[] = {-1, 0, 0, +1};
const int dy[] = {0, -1, +1, 0};
const int MAX = 100100;
int n;
int a[MAX];
int k[MAX];
namespace subtask1 {
void solve(void) {
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> k[i];
int res = 1, maskAns = 1;
for (int mask = 1; mask < (1 << n); ++mask) {
for (int i = 0; i < n; ++i) if (mask >> i & 1) {
int preVal = a[i]; bool ok = true;
for (int j = i + 1; j < n; ++j) if (mask >> j & 1) {
ok &= __builtin_popcount(a[j] & preVal) == k[j];
preVal = a[j];
}
if (ok && maximize(res, __builtin_popcount(mask))) maskAns = mask;
break;
}
}
cout << res << '\n';
for (int i = 0; i < n; ++i)
if (maskAns >> i & 1) cout << i + 1 << ' ';
return;
}
}
namespace subtask2 {
int dp[5050], trace[5050];
void solve(void) {
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) cin >> k[i];
memset(trace, 0, sizeof trace);
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; ++i) {
maximize(dp[i], 1);
for (int j = i + 1; j <= n; ++j) {
if (__builtin_popcount(a[i] & a[j]) == k[j])
if (maximize(dp[j], dp[i] + 1)) trace[j] = i;
}
}
int posAns = max_element(dp + 1, dp + 1 + n) - dp;
cout << dp[posAns] << '\n';
vector<int> res;
do {
res.push_back(posAns);
posAns = trace[posAns];
} while (posAns > 0);
reverse(all(res));
for (int x: res) cout << x << ' ';
return;
}
}
namespace subtask3 {
pair<int, int> trace[MAX][1 << 8];
int dp[MAX][1 << 8];
void solve(void) {
memset(trace, 0, sizeof trace);
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; ++i) {
maximize(dp[i][a[i]], 1);
for (int mask = 0; mask < (1 << 8); ++mask) {
if (maximize(dp[i][mask], dp[i - 1][mask])) trace[i][mask] = {i - 1, mask};
if (dp[i - 1][mask] && __builtin_popcount(mask & a[i]) == k[i])
if (maximize(dp[i][a[i]], dp[i - 1][mask] + 1))
trace[i][a[i]] = {i - 1, mask};
}
}
int ansMask = -1, ans = 0;
for (int mask = 0; mask < (1 << 8); ++mask)
if (maximize(ans, dp[n][mask])) ansMask = mask;
cout << ans << '\n';
vector<int> res;
do {
int prevN = trace[n][ansMask].fi, prevMask = trace[n][ansMask].se;
if (dp[prevN][prevMask] != dp[n][ansMask]) res.push_back(n);
n = prevN, ansMask = prevMask;
} while (n > 0);
reverse(all(res));
for (int x: res) cout << x << ' ';
return;
}
}
void solve(void) {
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> n;
if (n <= 15) subtask1::solve(); else
if (n <= 5000) subtask2::solve();
else {
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) cin >> k[i];
if (*max_element(a + 1, a + 1 + n) < (1 << 8)) subtask3::solve();
else solve();
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
subsequence.cpp: In function 'int main()':
subsequence.cpp:120:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
120 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
subsequence.cpp:121:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
121 | freopen(task".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |