B. Array

题目链接:http://codeforces.com/contest/224/problem/B

具体大意:

输入n,m。

给你一个区间,让你找某一段区间中包含m个不同的数,并且这段区间中的某一个小区间里不能有比l,r更小的区间使得该条件成立。

具体思路:先从一开始开始跑,跑到够k个数的时候就停下,然后这个区间中一定包含题目条件所要求的区间,然后再就是从区间的末尾开始往回找,找到足够m个就停下。

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
# define maxn 1000000
# define  ll long long
#define inf 0x3f3f3f3f
#define ll_inf 0x3f3f3f3f3f3f3f3f
long long int a[maxn];
long long int b[maxn];
long long int c[maxn];
map<int,int >q;
int main()
{
    ios::sync_with_stdio(false);
    long long int n,m;
    cin>>n>>m;
    q.clear();
    int ans=0;
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
        if(b[a[i]]==0)
        {
            ans++;//记录是否有足够的不同的数
            b[a[i]]=1;
            c[i]=1;
        }
    }
    if(ans<m)cout<<-1<<" "<<-1<<endl;
    else
    {
        for(int i=1; i<=n; i++)
        {
            c[i]=c[i-1]+c[i];
        }//计算关于个数的前缀和
        int flag=0;
        long long int t1=-1,t2=-1;
        for(int i=1; i<=n-m+1; i++)
        {
            for(int j=i+m-1; j<=n; j++)
            {
                if(c[j]-c[i]+1>m)break;
                if(c[j]-c[i]+1==m)
                {
                    t1=i,t2=j;
                    flag=1;
                    break;
                }//找到就停止
            }
            if(flag==1)break;
        }
        if(t1==-1&&t2==-1)
            cout<<t1<<" "<<t2<<endl;
        else
        {
            for(int i=t1; i<=t2; i++)
            {
                q[a[i]]++;
            }//先把这段区间的不同的值记录下来,这里相同的数不一定是连在一起的
            int g=1;
            q[a[t2]]=0;
            for(int i=t2-1; i>0; i--)
            {
                if(q[a[i]]!=0)
                {
                    q[a[i]]=0;
                    g++;
                }
                if(g==m)
                {
                    t1=i;
                    break;
                }
            }
            cout<<t1<<" "<<t2<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/letlifestop/p/10262961.html