Submission #744775

#TimeUsernameProblemLanguageResultExecution timeMemory
744775chanhchuong123Longest beautiful sequence (IZhO17_subsequence)C++14
23 / 100
108 ms262144 KiB
#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; }

Compilation message (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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...