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;
}
尺取法,比赛的时候觉的是二分。。然后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;
}
相关文章推荐
- codeforces 616D Longest k-Good Segment(two pointer)
- 【CodeForces 616D】Longest k-Good Segment
- CodeForces 616B Dinner with Emma【水】
- CodeForces 616D Longest k-Good Segment(尺取)
- 【CodeForces】616D - Longest k-Good Segment
- Educational Codeforces Round 5 :(codeforces 616)
- CodeForces 616D Longest k-Good Segment
- problem - 616B -codeforces
- CodeForces 616D Longest k-Good Segment(尺取)
- 第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)
- codeforces 616A Comparing Two Long Integers
- codeforces 616D Longest k-Good Segment
- Codeforces 616D Longest k-Good Segment【尺取法】
- CodeForces 616A Comparing Two Long Integers
- CodeForces 616D Longest k-Good Segment
- codeforces 616E Sum of Remainders (数论,找规律)
- CodeForces 616 A. Comparing Two Long Integers(水~)
- CodeForces - 616D Longest k-Good Segment (尺取法)
- codeforces 616D Longest k-Good Segment
- Codeforces 616 D. Longest k-Good Segment