我们发现这道题的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()
{
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;
ll val;
if(V[odd][0]<V[even][0])
val=V[odd][0],flag=1;
else
val=V[even][0],flag=0;
it=V[odd].begin();
it1=V[even].begin();
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;
}