欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019CCPC-江西省赛-Wave

程序员文章站 2022-05-15 22:53:27
...

Problem Description

Avin is studying series. A series is called “wave” if the following conditions are satisfied:

  1. It contains at least two elements;
  2. All elements at odd positions are the same;
  3. All elements at even positions are the same;
  4. Elements at odd positions are NOT the same as the elements at even positions.
    You are given a series with length n. Avin asks you to find the longest “wave” subseries. A subseries is a subsequence of a series.

Input

The first line contains two numbers n, c (1 ≤ n ≤ 100, 000, 1 ≤ c ≤ 100). The second line contains n integers whose range is [1, c], which represents the series. It is guaranteed that there is always a “wave” subseries.

Output

Print the length of the longest “wave” subseries.

Sample Input

5 3
1 2 1 3 2

Sample Output

4

题目大意

Avin正在研究序列。若符合下列条件,则称为“波”:
1)至少包含两个元素;
2)所有奇数位置的元素都是相同的;
3)所有偶数位置的元素都是相同的;
4)奇数位置的元素与偶数位置的元素不相同。
给出一个长度为n的序列。Avin要求你找出最长的“波”子序列。

核心思想:

c的范围是1~100,用vec[i]有序存储数值i出现的位置
波序列只含有两个不同的元素,而c的范围又很小,枚举所含元素的所有情况。对于每种情况,算出一个序列长度,输出最长的序列长度即可。
时间复杂度:
两重for循环c2,遍历数值的位置n/c,所以c2Xn/c=nXc。
时间复杂度为O(nXc)。

代码如下:

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
vector<int>vec[110];
int main()
{
	int n,c,x;
	while(scanf("%d%d",&n,&c)!=EOF)
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			vec[x].push_back(i);
		}
		int ans=0;
		for(int i=1;i<=c;i++)
			for(int j=1;j<=c;j++)
			{
				if(i==j)continue;
				int sum=0,k=0;//sum记波序列长度,k记前一个元素的位置 
				int p=0,q=0;//p遍历i的位置,q遍历j的位置 
				int ep=vec[i].size(),eq=vec[j].size();
				while(1)
				{
					//处理奇位置 
					while(p<ep&&vec[i][p]<k)p++;
					if(p==ep)
						break;
					k=vec[i][p];
					sum++;
					//处理偶位置 
					while(q<eq&&vec[j][q]<k)q++;
					if(q==eq)
						break;
					k=vec[j][q];
					sum++;
				}
				ans=max(ans,sum);
			}
		printf("%d\n",ans);
		for(int i=0;i<=c;i++)
			vec[i].clear();
	}
	return 0;
}