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...