子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
 
描述

给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次。

如2 8 8 8 1 1,所求子串就是2 8 8 8 1。

 
输入
第一行输入一个整数T(0<T<=5)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000000),表示给定序列的长度。
随后的一行有N个正整数,表示给定的序列中的所有元素。
数据保证输入的整数都不会超出32位整数的范围。
输出
对于每组输入,输出包含该序列中所有元素的最短子序列的长度
样例输入
  1. 2
  2. 5
  3. 1 8 8 8 1
  4. 6
  5. 2 8 8 8 1 1
样例输出
  1. 2
  2. 5
  3.  
  4. 解题思路:刚开始看了网上的解题报告,有个类似的题,可以用stl中的集合set和键值对map来做,结果超时,实践发现每次数据一大,用STL就会超时。
    离散化
    :将a数组的备份temp[]排序,然后把不重复的值都弄到X数组中,接下来开始挨着求出a中的每一个元素在X中的位置,用index记录。
      这样每次到a[i],index[i]中记录的就是a[i]在X[]中的位置。
      尺取法:
      通过观察发现,所求序列的第一个一定是在序列中只出现1次的,不然就可以直接把这个舍去了。
      设置s,e分别为所求序列的起始和结束。
      e每次都++,然后当序列中元素个数==非重复元素个数len时,要用minn记录此时序列长度。然后再s++(直到X[index[s]]==1)。
      最后到e不小于n然后结束。
      
      

 代码:

  1. #include<cstdio>
  2. #include <iostream>
  3. #include<map>
  4. #include<set>
  5. #include<algorithm>
  6. #include <cstring>
  7. #define MAXN 1000005
  8.  
  9. using namespace std;
  10.  
  11. int n;
  12. int cou;
  13. int a[MAXN];//所有元素
  14. int X[MAXN];//不重复元素
  15. int temp[MAXN];//临时
  16. int inde[MAXN];//存储a[]中每一个元素在X中的下标
  17.  
  18. int bin_search(int cou,int aa){
  19. int s=,e=cou-;
  20. int mid;
  21. while(s<=e){
  22. mid=(s+e)>>;
  23. if(X[mid]==aa){
  24. return mid;
  25. }else{
  26. if(aa<X[mid]){
  27. e=mid-;
  28. }else{
  29. s=mid+;
  30. }
  31. }
  32.  
  33. }
  34. }
  35.  
  36. void discrete(){
  37. cou=;
  38. sort(temp,temp+n);
  39. X[]=temp[];
  40. for(int i=;i<n;i++){
  41. if(temp[i]!=temp[i-]){
  42. X[cou++]=temp[i];
  43. }
  44. }
  45. for(int i=;i<n;i++){
  46. inde[i]=bin_search(cou,a[i]);
  47. }
  48. }
  49.  
  50. int main()
  51. {
  52. int t;
  53. scanf("%d",&t);
  54. while(t--){
  55.  
  56. int minn=;
  57. scanf("%d",&n);
  58. for(int i=;i<n;i++){
  59. scanf("%d",&a[i]);
  60. temp[i]=a[i];
  61. }
  62. discrete();
  63. memset(X,,sizeof(X));
  64. int len=cou;
  65. int s=,e=;
  66. int number=;
  67. while(e<n){
  68. if(X[inde[e]]==) number++;
  69. X[inde[e]]++;
  70. while(X[inde[s]]>=){
  71. X[inde[s]]--;
  72. s++;
  73. }
  74. if(number==len){
  75. minn=min(minn,e-s+);
  76. /*if(X[inde[s]]==1)*/ number--;
  77. X[inde[s]]--;
  78. s++;
  79. }
  80. e++;
  81. }
  82. printf("%d\n",minn);
  83. }
  84. return ;
  85. }

nyoj133_子序列_离散化_尺取法的更多相关文章

  1. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  2. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  3. BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德

    BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ...

  4. Unique Snowflakes UVA - 11572 (离散化+尺取法)

    Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a ...

  5. POJ3666 线性dp_离散化_贪心

    POJ3666 线性dp_离散化_贪心 就DP而言这个题不算难,但是难就难在贪心,还有离散化的思想上 题目大意:n个土堆,问你最少移动多少单位的图,可以使得这n个土堆变成单调的 dp[i][j]表示前 ...

  6. 51Nod 1686 第K大区间(离散化+尺取法)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 思路: 第K大值,所以可以考虑二分法,然后用尺取法去扫描, ...

  7. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  8. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

  9. POJ 尺取法

    poj3061 Subsequence 题目链接: http://poj.org/problem?id=3061 挑战P146.题意:给定长度为n的数列整数a0,a1,...,a(n-1)以及整数S, ...

随机推荐

  1. CF459B Pashmak and Flowers (水

    Pashmak and Flowers Codeforces Round #261 (Div. 2) B. Pashmak and Flowers time limit per test 1 seco ...

  2. Mongoose简单的连表查询

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 像我这篇文章所说的基于Node.js + jade + Mongoose 模仿gokk.tv,当时停止开发是因为我深深的 ...

  3. JLS(Third Edition) Chapter12 Execution

    这一章详细说明在一个program执行时,发生的activities. 它根据JVM和组成program的类.接口.实例的生命周期 组织.   一个JVM从加载一个特定的类并调用它的main方法开始启 ...

  4. 湖南附中模拟day1 金坷垃

    题意描述"没有金坷垃,怎么种庄稼?"花花家有一块田,所有庄稼排成了 N 行 M 列.初始时,每棵庄稼都有一个自己的高度hi;j.花花每次可以使用 1mol 的金克拉使一棵庄稼的高度 ...

  5. 给Windows + Apache 2.2 + PHP 5.3 安装PHP性能测试工具 xhprof_0.10.3_php53_vc9.dll

    1.下载XHProf 到这里 http://dev.freshsite.pl/php-extensions/xhprof.html 下载Windows版本的XHProf,我这里选择下载 XHProf ...

  6. Mac os壁纸提取

    想必用过Mac os系统的朋友都知道mac壁纸,提取出来用作壁纸是十分好看的 下面给出壁纸的位置,自己用文件管理器打开然后复制出来即可! 系统盘:/Library/DesktopPictures

  7. 01knockout应用开发之遍历简单数据$Index、$data

    在knockout环境下,如何遍历一个简单的数组?对于遍历对象组件的数组来说,很容易,直接foreach:对象名,然后进行属性的绑定即可,而如下数据[10,20,30]这种简单的数组,如何去遍历呢?在 ...

  8. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  9. C,C++经典笔试题(答案)转自:http://blog.163.com/jianhuali0118@126/blog/static/377499702008230104125229/

    一.请填写BOOL , float, 指针变量 与“零值”比较的 if 语句.(10分) 请写出 BOOL   flag 与“零值”比较的 if 语句.(3分) 标准答案:      if ( fla ...

  10. Struts2 验证规则配置文件

    1. Action级别校验命名格式: ActionClassName-validation.xml 2. Action中某个方法的校验命名格式: ActionClassName-ActionAlias ...