http://codeforces.com/contest/616/problem/D
直接扫一遍
当kind超过m则去掉最前面的元素,并且更新map,
否则map[元素]++
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int n,m;
int tm[5*100000+8] ;
map<int,int> sb;
int main()
{
cin>>n>>m;
int i,j;
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
int max_long=0;
int size=0;
int st=1;
int max_st;
for (i=1;i<=n;i++)
{
if (sb.find(tm[i])==sb.end())
{
while(size==m)
{
if (sb[tm[st]]>0)
sb[tm[st]]--;
if (sb[tm[st]]==0)
sb.erase(tm[st]);
size=sb.size();
st++;
}
size++;
if (i-st+1>max_long)
{
max_long=i-st+1;
max_st=st;
}
sb[tm[i]]++;
}
else
{
sb[tm[i]]++;
if (i-st+1>max_long)
{
max_long=i-st+1;
max_st=st;
}
}
}
printf("%d %d\n",max_st,max_st+max_long-1);
return 0;
}