| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 92066 | emil_physmath | Longest beautiful sequence (IZhO17_subsequence) | C++17 | 6081 ms | 2152 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
const int MAXN=100000+5;
 
int a[MAXN], k[MAXN], dp[MAXN], prevNum[MAXN], maxdp[1<<9];
void SubTaskTwo(int n);
void SubTaskThree(int n);
int NumBits(int);
int main()
{
	int n;
	cin>>n;
	for (int i=0; i<n; i++)
		scanf("%d", a+i);
	for (int i=0; i<n; i++)
		scanf("%d", k+i);
	if (n<=5000)
		SubTaskTwo(n);
	else
		SubTaskThree(n);
	char I;
	cin >> I;
	return 0;
}
void SubTaskTwo(int n)
{
	dp[0]=1;
	prevNum[0]=-1;
	for (int i=1; i<n; i++)
	{
		dp[i]=1;
		prevNum[i]=-1;
		for (int j=0; j<i; j++)
			if (NumBits(a[i] & a[j])==k[i])
				if (dp[j]+1>dp[i])
				{
					dp[i]=dp[j]+1;
					prevNum[i]=j;
				}
	}
	int bestEnd;
	for (int i=0; i<n; i++)
		if (!i || dp[i]>dp[bestEnd])
			bestEnd=i;
	stack<int> ans;
	int curNum=bestEnd;
	ans.push(curNum);
	while (prevNum[curNum]!=-1)
	{
		curNum=prevNum[curNum];
		ans.push(curNum);
	}
	cout<<ans.size()<<'\n';
	while (!ans.empty())
	{
		cout<<ans.top()+1<<' ';
		ans.pop();
	}
	cout<<'\n';
}
void SubTaskThree(int n)
{
	for (int j=0; j<(1<<8); j++)
		maxdp[j]=-1;
	dp[0]=1;
	prevNum[0]=-1;
	maxdp[a[0]]=0;
	for (int i=1; i<n; i++)
	{
		if (a[i]>(1<<8) || a[0]>(1<<8))
			for(;;);
		dp[i]=1;
		prevNum[i]=-1;
		for (int j=0; j<(1<<8); j++)
			if (NumBits(a[i] & j)==k[i])
				if (maxdp[j]!=-1 && dp[maxdp[j]]+1>dp[i])
				{
					dp[i]=dp[maxdp[j]]+1;
					prevNum[i]=maxdp[j];
				}
		if (maxdp[a[i]]==-1 || dp[i]>dp[maxdp[a[i]]])
			maxdp[a[i]]=i;
	}
	int bestEnd=0;
	for (int i=1; i<n; i++)
		if (dp[i]>dp[bestEnd])
			bestEnd=i;
	stack<int> ans;
	int curNum=bestEnd;
	ans.push(curNum);
	while (prevNum[curNum]!=-1)
	{
		curNum=prevNum[curNum];
		ans.push(curNum);
	}
	cout<<ans.size()<<'\n';
	while (!ans.empty())
	{
		printf("%d ", ans.top()+1);
		ans.pop();
	}
	cout<<'\n';
}
int NumBits(int n)
{
	int res=0;
	while (n)
	{
		if (n & 1)
			res++;
		n>>=1;
	}
	return res;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
