题意:找到一个长度最长的含有最多k个不同数字的序列,输出它的坐标
尺取法,比赛的时候觉的是二分。。然后T9。。
之前没有做过尺取法的题目,大佬们都好厉害啊TUT,赶紧补一发尺取专题TUT
#include<bits/stdc++.h>
using namespace std;
const int N=512345;
const int M=1123456;
int vis[M],a[N];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int pi=1,pj=1,ansi=1,ansj=1;
int num=0;
for(pj=1;pj<=n;pj++)
{
vis[a[pj]]++;
if(vis[a[pj]]==1)num++;
while(num>k)
{
vis[a[pi]]--;
if(vis[a[pi]]==0)num--;
pi++;
}
if(pj-pi+1>ansj-ansi+1)
{
ansj=pj;
ansi=pi;
}
}
printf("%d %d\n",ansi,ansj);
return 0;
}
本文介绍了一种使用尺取法解决寻找最长序列的问题,该序列包含最多k个不同的数字。通过逐步移动序列的边界来更新最长序列的位置,并提供了一个具体的C++实现示例。

4386

被折叠的 条评论
为什么被折叠?



