您的位置:首页 > 其它

CodeForces - 616D 尺取法 two pointer

2018-01-20 09:47 148 查看
题意:找到一个长度最长的含有最多k个不同数字的序列,输出它的坐标

尺取法,比赛的时候觉的是二分。。然后T9。。

之前没有做过尺取法的题目,大佬们都好厉害啊TUT,赶紧补一发尺取专题TUT

#include<bits/stdc++.h>

using namespace std;
const int N=512345;
const int M=1123456;

int vis[M],a
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: