Submission #1303899

#TimeUsernameProblemLanguageResultExecution timeMemory
1303899ChottuFLongest beautiful sequence (IZhO17_subsequence)C++20
100 / 100
3086 ms91960 KiB
#include <bits/stdc++.h>
using namespace std;

pair<int,int> best[1<<10][1<<10][11];
//xhigh, mask, resulting pop
//stores {max length ending here and the index of the guy this was donated from}
const int MAXN = 1e5+5;
int prv[MAXN];

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    for (int i = 0; i<MAXN; i++){
        prv[i] = -1;
    }
    
    int n;
    cin >> n;
    int arr[n];
    int k[n];
    for (int i = 0; i<n; i++){
        cin >> arr[i];
    }
    for (int i = 0; i<n; i++){
        cin >> k[i];
    }
    int allmx = 0;
    int st = -1;
    for (int i = 0; i<n; i++){
        int x = arr[i];
        
        int xhigh = x >> 10;
        int xlow = x & 1023;
        
        int mx = 0;
        int bf = -1;
        //first query
        
        for (int h = 0; h<1024; h++){
            int hpop = __builtin_popcount(xhigh & h);
            int lft = k[i] - hpop;
            if (lft < 0 || lft > 10) continue;
            auto [cr,idx] = best[h][xlow][lft];
            if (cr != 0){
                //actually exists
                if (cr > mx){
                    mx = cr;
                    bf = idx;
                }
            }
        }
        mx++;
        if (mx > allmx){
            allmx = mx;
            st = i;
        }
        prv[i] = bf;
        //update
        for (int mask = 0; mask<1024; mask++){
            int plow = __builtin_popcount(xlow & mask);
            pair<int,int> res = {mx,i};
            best[xhigh][mask][plow] = max(best[xhigh][mask][plow], res);
        }
    }
    cout << allmx << '\n';
    vector<int> ss;
    ss.push_back(st);
    while (prv[st] != -1){
        ss.push_back(prv[st]);
        st = prv[st];
    }
    reverse(ss.begin(),ss.end());
    for (auto u : ss){
        cout << u+1 << " ";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...