zoukankan      html  css  js  c++  java
  • CF616D Longest k-Good Segment

    题目描述

    给定一个包含(n)个整数的序列(a)(0le a_i le 10^6),询问不重复数字个数(le k)的最长区间的左右端点。如果有多解输出任意一组。

    输入输出格式

    输入格式:

    The first line contains two integers (n,k) ( (1 leq k leq n leq 5·10^{5})) — the number of elements in (a) and the parameter (k) .

    The second line contains nn integers (a_{i})(( 0<=a_{i}<=10^{6})) — the elements of the array (a) .

    输出格式:

    Print two integers (l,r) ((1<=l<=r<=n)) — the index of the left and the index of the right ends of some k-good longest segment. If there are several longest segments you can print any of them. The elements in aa are numbered from (1) to (n) from left to right.

    输入输出样例

    输入样例#1:

    5 5
    1 2 3 4 5
    

    输出样例#1:

    1 5
    

    输入样例#2:

    9 3
    6 5 1 2 3 2 1 4 5
    

    输出样例#2:

    3 7
    

    输入样例#3:

    3 1
    1 2 3
    

    输出样例#3:

    1 1
    

    思路:题意为在长度为(n)的串中找出有k个不同数字的最长连续子串,输出子串开始以及结束的位置,然而数据有点水,我们直接用(STL)中的(map)记录一下即可。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<map>
    #define maxn 1000007
    using namespace std;
    map <int,int> mp;
    int a[maxn],l,len,cyh,zrj;
    void del(int x)
    {
        mp[x]--;
        if(mp[x]==0) mp.erase(x);
    }
    int main() {
      int n,k;
      scanf("%d%d",&n,&k);
      for(int i=0;i<n;++i) scanf("%d",&a[i]);
      for(int i=0;i<n;++i) {
        mp[a[i]]++;
        if(mp.size()>k) {
          for(;l<n&&mp.size()>k;++l)
            del(a[l]);
        }
        int ll=i-l+1;
        if(ll>len) {
          len=ll;
          cyh=l;
          zrj=i;
        }
      }
      printf("%d %d
    ",cyh+1,zrj+1);
      return 0;
    }
    
  • 相关阅读:
    2019年度SAP项目实践计划
    实现祖国统一其实并不难
    2018年终总结之摄影作品展
    2018年终总结之访问量较大的原创文章
    2018年终总结之AI领域开源框架汇总
    2018 AI产业界大盘点
    为什么我觉得Python烂的要死?
    SAP MM 根据采购订单反查采购申请?
    2018-8-10-win10-uwp-ApplicationView
    2018-8-10-WPF-播放-gif
  • 原文地址:https://www.cnblogs.com/grcyh/p/10201435.html
Copyright © 2011-2022 走看看