Submission #1269349

#TimeUsernameProblemLanguageResultExecution timeMemory
1269349g4yuhgLongest beautiful sequence (IZhO17_subsequence)C++20
40 / 100
74 ms1608 KiB
//Huyduocdithitp
#include <bits/stdc++.h>
typedef int ll;
#define pii pair<ll, ll>
#define MP make_pair
#define fi first
#define se second
#define TASK "subsequence"
#define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);
#define N 100005
#define LOG 19
#define endl '\n'
using namespace std;

bool ghuy4g;

ll n, a[N], k[N];

ll dp[N], ans, trace[N], f[N];

void sub1() {
	ll id = 0;
	for (int i = 1; i <= n; i ++) {
		dp[i] = 1;
		for (int j = i - 1; j >= 1; j --) {
			if (__builtin_popcount(a[i] & a[j]) == k[i]) {
				dp[i] = max(dp[i], dp[j] + 1);
				if (dp[i] == dp[j] + 1) {
					trace[i] = j;
				}
			}
		}
		if (ans < dp[i]) {
			ans = dp[i];
			id = i;
		}
	}
	cout << ans << endl;
	vector<ll> vt;
	while (true) {
		vt.push_back(id);
		id = trace[id];
		if (id == 0) break;
	}
	reverse(vt.begin(), vt.end());
	for (auto it : vt) cout << it << " ";
}

void sub2() {
	ll id = 0;
	for (int i = 1; i <= n; i ++) {
		ll res = 1;
		for (int mask = 0; mask < (1 << 8); mask ++) {
			if (dp[mask] == 0 || __builtin_popcount(mask & a[i]) != k[i]) continue;
			if (res < dp[mask] + 1) {
				res = dp[mask] + 1;
				trace[i] = f[mask];
			}
		}
		if (res > dp[a[i]]) {
			dp[a[i]] = res;
			f[a[i]] = i;
		}
		//cout << "old id " << id << endl;
		if (ans < res) {
			//cout << i << " " << ans << " | " << res << endl;
			ans = res;
			id = i;
			//cout << "newid " << id << endl;
		}
		//cout << ans << " " << res << " " << id << endl;
	}
	cout << ans << endl;
	vector<ll> vt;
	while (true) {
		vt.push_back(id);
		id = trace[id];
		if (id == 0) break;
	}
	reverse(vt.begin(), vt.end());
	for (auto it : vt) cout << it << " ";
}

bool klinh;

signed main(void) {
    start;
    faster;
	  
	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) {
		sub1();
	}
	else {
		sub2();
	}
   	
    cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
    return 0;
}

Compilation message (stderr)

subsequence.cpp: In function 'int main()':
subsequence.cpp:9:47: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 | #define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
      |                                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
subsequence.cpp:88:5: note: in expansion of macro 'start'
   88 |     start;
      |     ^~~~~
subsequence.cpp:9:76: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 | #define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
      |                                                                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
subsequence.cpp:88:5: note: in expansion of macro 'start'
   88 |     start;
      |     ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...