CSUST 2009-Longest Subarray(队列的应用)

题目链接:http://acm.csust.edu.cn/problem/2009
CSDN食用链接:https://blog.csdn.net/qq_43906000/article/details/107664641
Description

You are given two integers \(C\),\(K\) and an array of \(N\) integers \(a_1,a_2,\cdots,a_N\)It is guaranteed that the value of \(a_i\) is between \(1\) to \(C\)

We define that a continuous subsequence \(a_{l},a_{l+1},...,a_r(l \leq r)\) of array a is a good subarray if and only if the following condition is met:
\(\forall x\in [1,C],\sum_{i=l}^{r}[a_i=x]\leq K\)

It implies that if a number appears in the subarray, it will appear no greater than \(K\) times.

You should find the longest good subarray and output its length. Or you should print \(0\) if you cannot find any.

Input
Each case starts with a line containing three positive integers \(N,K,C (1 \leq N,K,C \leq 300000)\)

The second line contains \(N\) integer \(a_1,a_2,\cdots a_N(1\leq a_i\leq C)\)

Output
For each test case, output one line containing an integer denoting the length of the longest good subarray.

Sample Input 1
5 1 3
1 2 3 1 2

Sample Output 1
3

emmm,CSUSTOJ为数不多的几道英文题面QWQ,实际上挺简单的。

题目大意:让你找到一个最长的的连续子序列,使得这个子序列中每个元素出现的次数小于等于\(K\)

既然是找连续的,那么这个就很简单了,一旦碰到出现次数大于\(K\)的,我们将前面的元素一直往外抛就完事了,这不就是个队列的问题了嘛。

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;

const int mac=3e5+10;

int vis[mac],a[mac];

int main(int argc, char const *argv[])
{
	int n,k,c;
	scanf ("%d%d%d",&n,&k,&c);
	for (int i=1; i<=n; i++)
		scanf ("%d",&a[i]);
	int ans=0,j=1;
	for (int i=1; i<=n; i++){
		vis[a[i]]++;
		while (vis[a[i]]>k){
			vis[a[j]]--; j++;
		}
		ans=max(ans,i-j+1);
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2020-07-29 15:09  lonely_wind  阅读(107)  评论(0编辑  收藏  举报