2019CCPC-江西省赛-Wave

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;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值