Submission #699801

#TimeUsernameProblemLanguageResultExecution timeMemory
699801vjudge1Longest beautiful sequence (IZhO17_subsequence)C++14
23 / 100
64 ms93536 KiB
#include <bits/stdc++.h>

using namespace std;
#define F first
#define S second
#define pb push_back
#define all(a) a.begin(), a.end()

typedef long long ll;
typedef pair<int, int> ii;

void print() {cerr << '\n';} template<typename t1, typename... t2>
void print(t1 a, t2... b) {cerr << a << ' ', print(b...);}
const int N = 1e5 + 5;
int n, a[N];
int k[N];

#define countBit(a) (__builtin_popcount(a))
namespace sub2
{
ii dp[N];
void solve()
{
    int mx = 0;
    for(int i = 1; i <= n; i++) dp[i] = {1, 0};
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j < i; j++)
            if(countBit(a[i] & a[j]) == k[i])
                dp[i] = max(dp[i], {dp[j].F + 1, j});
        mx = max(mx, dp[i].F);
    }

    cout << mx << '\n';
    vector<int> res;
    for(int i = 1; i <= n; i++)
        if(dp[i].F == mx)
        {
            do
            {
                res.pb(i);
                i = dp[i].S;
            }while(i != 0);
            break;
        }
    reverse(all(res));
    for(int &x : res) cout << x << ' ';
}
};

namespace sub4
{
ii dp[N];
int f[1 << 10][1 << 10][11];
void solve()
{
    int mx = 0;
    dp[0] = {0, 0};
    memset(f, 01, sizeof f);
    for(int i = 1; i <= n; i++)
    {
        int L = a[i] >> 10;
        int R = a[i] - L;
        dp[i] = {1, 0};
        for(int curL = 0; curL < (1 << 10); curL++)
        {
            int cntR = k[i] - countBit(L & curL);
            if(cntR < 0 || cntR > 10) continue;
            int j = f[curL][R][cntR];
            dp[i] = max(dp[i], {dp[j].F + 1, j});
        }
        mx = max(mx, dp[i].F);
        for(int nxtR = 0; nxtR < (1 << 10); nxtR++)
        {
            int cntR = countBit(R & nxtR);
            int &j = f[L][nxtR][cntR];
            if(dp[j].F < dp[i].F) j = i;
        }
    }
    cout << mx << '\n';
    vector<int> res;
    for(int i = 1; i <= n; i++)
        if(dp[i].F == mx)
        {
            do
            {
                res.pb(i);
                i = dp[i].S;
            }while(i != 0);
            break;
        }
    reverse(all(res));
    for(int &x : res) cout << x << ' ';
}
};

void solve()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    for(int i = 1; i <= n; i++)
        cin >> k[i];
    if(n <= 5000)
        sub2::solve();
    else
        sub4::solve();
}

signed main()
{
    if(fopen("test.inp", "r"))
    {
        freopen("test.inp", "r", stdin);
        freopen("test.out", "w", stdout);
    }
    cin.tie(0) -> sync_with_stdio(0);
    int t = 1;
//    cin >> t;
    while(t--) solve();
    return 0;
}

Compilation message (stderr)

subsequence.cpp: In function 'int main()':
subsequence.cpp:114:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         freopen("test.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
subsequence.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  115 |         freopen("test.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...