zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    FirstThunk
    FirstThunk
    输入地址表(IAT)
    PE文件讲解
    PE格式详细讲解
    pe结构讲解
    PE格式详细讲解
    输入地址表(IAT)
    pe结构讲解
    zindex可以使用负值
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262960.html
Copyright © 2011-2022 走看看