Submission #314204

#TimeUsernameProblemLanguageResultExecution timeMemory
314204TricksterLongest beautiful sequence (IZhO17_subsequence)C++14
40 / 100
107 ms2936 KiB
#include <bits/stdc++.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
#include <map>

using namespace std;

#define N 100010
#define ff first
#define ss second
#define ll long long
#define pb push_back
#define mod 1000000007
#define pii pair <int, int>
#define sz(a) int(a.size())
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
ll bigmod(ll a,ll e) {if(e==0)return 1;ll x=bigmod(a*a%mod,e>>1);return e&1?x*a%mod:x;}

int n;
int Pr[N];
int sz[N];
int in[N];
int dp[N];
int v[N], k[N];

int main()
{
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> v[i];
    for(int i = 1; i <= n; i++) cin >> k[i];

    if(n <= 5000) {
        for(int i = 1; i <= n; i++) {
            sz[i] = 1;

            for(int h = 1; h < i; h++) {
                int x = (v[i]&v[h]);

                if(__builtin_popcount(x) != k[i]) continue;

                if(sz[i] < sz[h]+1) {
                    sz[i] = sz[h]+1;
                    Pr[i] = h;
                }
            }
        }

        int mx = 0, pos = 0;
        for(int i = 1; i <= n; i++)
            if(mx < sz[i]) {
                mx = sz[i];
                pos = i;
            }

        vector <int> A;
        while(pos) A.pb(pos), pos = Pr[pos];
        reverse(A.begin(), A.end());

        cout << A.size() << "\n";
        for(auto i: A) cout << i << " ";
        
        return 0;
    }

    for(int i = 1; i <= n; i++) {
        int now = 1;

        for(int h = 0; h < (1<<8); h++) {
            int x = (v[i]&h);

            if(__builtin_popcount(x) != k[i]) continue;

            if(now < dp[h]+1) {
                now = dp[h]+1;
                Pr[i] = in[h];
            }
        }

        sz[i] = now;
        if(dp[v[i]] < now) {
            dp[v[i]] = now;
            in[v[i]] = i;
        }
    }

    int mx = 0, pos = 0;
    for(int i = 1; i <= n; i++) if(mx < sz[i]) {
        mx = sz[i];
        pos = i;
    }

    vector <int> A;
    while(pos) A.pb(pos), pos = Pr[pos];
    reverse(A.begin(), A.end());

    cout << A.size() << "\n";
    for(auto i: A) cout << i << " ";
}
/*
4
1 2 3 4
10 0 1 0
5
5 3 5 3 5
10 1 20 1 20
*/

Compilation message (stderr)

subsequence.cpp:23: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
   23 | #pragma GCC optimization ("O3")
      | 
subsequence.cpp:24: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
   24 | #pragma GCC optimization ("unroll-loops")
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...