我们发现这道题的C很小,所以得从这方面下手,把这些数依据奇偶性划分成两个集合,并且把每一个数在序列中出现的位置记录下来,我们暴力尝试每一个奇数和偶数构成的Wave,最后取一个最大值就行了,每一次尝试过程是这样的的比如:N<mark>8 C</mark>2 2 1 1 2 2 1 2 1

1的位置:2 3 6 8 2的位置有:1 4 5 7

位置最小的是2中的1,然后在1中找第一个大于1的位置,此时是2,然后在2中找到第一个大于2的位置,此时是4,然后在1中找到一个大于4的位置……依次交替查找下去,直到查找失败


```#pragma GCC optimize(2)
#include<bits/stdc++.h>

using namespace std;

#define pi acos(-1.0)
#define e exp(1.0)
typedef long long ll;
const ll maxn=1e5+7;
ll N,C;
vector<ll>V[120];//存每一个数出现的位置 
vector<ll>O,E;//存奇偶数 
vector<ll>::iterator it,it1;
int main()
{
// freopen(".../.txt","w",stdout);
	ios::sync_with_stdio(false);
	cin>>N>>C;
	ll i,j;
	for(i=1;i<=N;i++)
	{
		ll n;
		cin>>n;
		V[n].push_back(i);//将每个数出现的位置存下来 
	}
	for(i=1;i<=C;i++)
	{
		if(V[i].size())
		{
			if(i&1)//依据奇偶性划分两个集合 
			O.push_back(i);
			else
			E.push_back(i);
		}
	}
	ll jie=0,odd,even,cnt;
	for(i=0;i<O.size();i++)
	{
		odd=O[i];
		for(j=0;j<E.size();j++)
		{
			cnt=1;
			even=E[j];
			bool flag=1;//因为要在奇数和偶数不断交替寻找下一个元素(也可以理解为位置)我用了flag来进行交替转换 
			ll val;//已经找好的序列最后一个元素的位置 
			if(V[odd][0]<V[even][0])//因为要从最小的位置开始, 
			val=V[odd][0],flag=1;
			else
			val=V[even][0],flag=0;//同上,flag初始不同表示下一次是在奇数还是偶数的位置中查找 
			it=V[odd].begin();//it表示在这个odd(奇数)出现的位置中,已经找到的最后面位置 
			it1=V[even].begin();//同上,只不过是偶数而已 ,it和it1其实也不需要,这样做只是为了缩小每一次查找的范围而已 
			while(1)
			{
				if(flag)
				{
					it1=upper_bound(it1,V[even].end(),val);
					if(it1==V[even].end())
					break;
					val=*it1;
					flag=!flag;//交替,状态转换 
					cnt++;
				}
				else
				{
					it=upper_bound(it,V[odd].end(),val);
					if(it==V[odd].end())
					break;
					val=*it;
					flag=!flag;//交替,状态转换 
					cnt++;
				}
			}
			jie=max(jie,cnt);
		}
	}
	cout<<jie<<endl;
	return 0;
}