Submission #528993

#TimeUsernameProblemLanguageResultExecution timeMemory
528993SansPapyrus683Longest beautiful sequence (IZhO17_subsequence)C++17
23 / 100
370 ms106780 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <bit>

using std::cout;
using std::endl;
using std::vector;

vector<vector<int>> prev_unique(const vector<int>& arr) {
    vector<vector<int>> ret(arr.size());
    for (int i = 0; i < arr.size(); i++) {
        for (int j = i + 1; j < arr.size(); j++) {
            ret[j].push_back(i);
            if (arr[j] == arr[i]) {
                break;
            }
        }
    }
    return ret;
}

/**
 * https://oj.uz/problem/view/IZhO17_subsequence
 * 5
 * 5 3 5 3 5
 * 10 1 20 1 20 should output
 * 2
 * 1 2
 */
int main() {
    int size;
    std::cin >> size;
    vector<int> arr(size);
    for (int& i : arr) {
        std::cin >> i;
    }
    vector<int> targets(size);
    for (int& t : targets) {
        std::cin >> t;
    }

    if (size <= 5000) {
        vector<int> longest(size, 1);
        vector<int> prev(size);
        for (int i = 1; i < size; i++) {
            prev[i] = i;
            for (int p = 0; p < i; p++) {
                if (std::__popcount(arr[i] & arr[p]) == targets[i]) {
                    if (longest[p] + 1 > longest[i]) {
                        longest[i] = longest[p] + 1;
                        prev[i] = p;
                    }
                }
            }
        }
        
        int max = *std::max_element(longest.begin(), longest.end());
        int i = 0;
        for (; longest[i] != max; i++);

        vector<int> seq{i};
        while (prev[seq.back()] != seq.back()) {
            seq.push_back(prev[seq.back()]);
        }

        cout << seq.size() << endl;
        for (int i = seq.size() - 1; i > 0; i--) {
            cout << seq[i] + 1 << ' ';
        }
        cout << seq.front() + 1 << endl;
    } else {
        vector<vector<int>> to_consider = prev_unique(arr);
        vector<int> longest(size, 1);
        vector<int> prev(size);
        for (int i = 1; i < size; i++) {
            prev[i] = i;
            for (int p : to_consider[i]) {
                if (std::__popcount(arr[i] & arr[p]) == targets[i]) {
                    if (longest[p] + 1 > longest[i]) {
                        longest[i] = longest[p] + 1;
                        prev[i] = p;
                    }
                }
            }
        }
        
        int max = *std::max_element(longest.begin(), longest.end());
        int i = 0;
        for (; longest[i] != max; i++);

        vector<int> seq{i};
        while (prev[seq.back()] != seq.back()) {
            seq.push_back(prev[seq.back()]);
        }

        cout << seq.size() << endl;
        for (int i = seq.size() - 1; i > 0; i--) {
            cout << seq[i] + 1 << ' ';
        }
        cout << seq.front() + 1 << endl;
    }
}

Compilation message (stderr)

subsequence.cpp: In function 'std::vector<std::vector<int> > prev_unique(const std::vector<int>&)':
subsequence.cpp:12:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     for (int i = 0; i < arr.size(); i++) {
      |                     ~~^~~~~~~~~~~~
subsequence.cpp:13:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |         for (int j = i + 1; j < arr.size(); j++) {
      |                             ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...