nyoj 133 子序列(尺取法+离散化)
子序列
- 描述
-
给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次。
如2 8 8 8 1 1,所求子串就是2 8 8 8 1。
- 输入
-
第一行输入一个整数T(0<T<=5)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000000),表示给定序列的长度。
随后的一行有N个正整数,表示给定的序列中的所有元素。
数据保证输入的整数都不会超出32位整数的范围。 - 输出
- 对于每组输入,输出包含该序列中所有元素的最短子序列的长度
- 样例输入
-
2 5 1 8 8 8 1 6 2 8 8 8 1 1
- 样例输出
-
2 5
解题思路:这道题数据比较大,可以先用离散化。接下来就是经典的尺取法了。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> #include<map> using namespace std;const int maxn = 1000005; const int inf = 0x3f3f3f3f; int n,cnt,a[maxn],tmp[maxn]; int idx[maxn],Count[maxn];int bisearch(int l,int r,int key) {int mid;while(l <= r){mid = (l + r) >> 1;if(tmp[mid] == key) return mid;else if(tmp[mid] < key) l = mid + 1;else r = mid - 1;} }void Discrete() {sort(tmp+1,tmp+1+n);cnt = 0;tmp[++cnt] = tmp[1];for(int i = 2; i <= n; i++)if(tmp[i] != tmp[i-1])tmp[++cnt] = tmp[i];for(int i = 1; i <= n; i++)idx[i] = bisearch(1,cnt,a[i]); }int main() {int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);tmp[i] = a[i];}Discrete();memset(Count,0,sizeof(Count));int r = 1,sum = 0,ans = inf;for(int i = 1; i <= n; i++){if(Count[idx[i]] == 0) sum++;Count[idx[i]]++;while(sum == cnt){Count[idx[r]]--;if(Count[idx[r]] == 0) sum--;ans = min(ans,i - r + 1);r++;}}printf("%d\n",ans);}return 0; }
nyoj 133 子序列(尺取法+离散化)相关推荐
- NOI2016区间bzoj4653(线段树,尺取法,区间离散化)
题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...
- 解题报告 (十三) 尺取法
文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...
- 尺取法 POJ 3601 Subsequence
题目传送门 1 /* 2 题意:求连续子序列的和不小于s的长度的最小值 3 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 4 1. 记录前i项的总和,求[i, p)长度的最小值,用二分 ...
- poj2566Bound Found尺取法进阶(java)
题目链接: 这个尺取法的思想挺好的,如果第一次做尺取法题,不妨看下尺取法入门题. 题目大意: 多组测试数据(0,0)截止. 每组数据输入 n,k(n数字个数,k询问次数) 下一行n个数表示序列. 接下 ...
- poj3320Jessica's Reading Problem—尺取法(java)
题目链接 大意:给序列数字,找出最小子序列,包含所有的元素类型.例如 5 1 8 8 8 1 输出2,因为1 8就包含了所有元素 思路:尺取法 这个和裸的尺取优点不同的是,他需要一个map来维护判断而 ...
- poj3061尺取法/前缀和 二分(java)
今天遇到这题因为以前没见到过,当时就是想着应该有着一个很简单的方法可以过但是奈何就是没思路.后来看了别人思路写了下来.学习了尺取法 poj3061 题目介绍: Description A sequen ...
- hdu 5178(尺取法)
pairs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem De ...
- B. Complete the Word (尺取法)
题目链接:http://codeforces.com/problemset/problem/716/B 题目大意:字符串中的 '?' 可以用A->Z任何一个来替换 问能不能通过替换使字符串有一个 ...
- P1712-[NOI2016]区间【线段树,尺取法】
正题 题目链接:https://www.luogu.com.cn/problem/P1712 题目大意 nnn个区间,求出其中mmm个区间使得它们有覆盖同一个点且最长区间长度减去最短长度最小. 解题思 ...
最新文章
- Maven自动FTP远程部署
- 【freemaker】之FreeMakerUtil工具类
- java核心面试_不正确的核心Java面试答案
- 江小白包装设计原型_江小白品牌策划、包装设计成功的点在哪?
- Linux下卸载vmware
- Android NDK开发之 NDK类型签名
- 小米平板android版本,小米平板2发布:分Android和Wind 10两个版本
- pythoncanny边缘检测自适应阈值_一种自适应阈值的Canny边缘检测算法
- Docker新手入门基础知识与实战教程
- MapInfo地图查询的简单实现
- 使用 .NET HttpClient 下载 PDF 文件的DEMO
- c++ iostream
- google开源技术(部分)
- 《即兴演讲》学习总结
- CSS3(新增样式)
- java 开发安卓im_Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展...
- linux gcc生成可执行代码命令,Makefile万能写法(gcc程序以及arm-linux-gcc程序)
- Java年月的正则表达式_java如何判断是否为有效的年月日
- 计算机网络(九)——可靠传输协议
- 屏幕截图--Take-ScreenShot分析