hdu2158 最短区间版大家来找碴
题意:
最短区间版大家来找碴
Problem Description
给定一个序列,有N个整数,数值范围为[0,N)。有M个询问,每次询问给定Q个整数,可能出现重复值。要求找出一个最短区间,该区间要包含这Q个整数数值。
你能找的出来吗?
Input
第一行有两个整数N,M。(N<100000, M<1000)接着一行有N个整数。再有M个询问,每个询问的第一行有一个整数Q(Q<100),第二行跟着Q个整数。当N,M同时为0时,输入结束。
Output
请输出最短区间的长度。保证有解。
Sample Input
5 2
1 2 2 3 1
3
1 2 3
3
1 1 3
0 0
Sample Output
3
2
Hint
第二个查询,找到的区间是[4,5]
思路:
这个题目做的有点纠结,我的时间复杂度没次询问都是O(N)的,那么一次测试的时间复杂度就是O(N*M)这样是1e了,这样估计就TLE了,但是却AC了,虽然理论上测试数据是随机数据,但是感觉还是有点勉强。我的思路是先找到一个最基本的L,R然后L不停的往后挤,然后维护R来保证当前的区间的正确性,同时更新最小值(这次的代码写的有点挫-_-).
#include<stdio.h>
#include<string.h> #define N 110000
int num[N] ,markc[N] ,markq[N]; int main ()
{
int n ,m ,q ,a ,i;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
for(i = 1 ;i <= n ;i ++)
scanf("%d" ,&num[i]);
while(m--)
{
scanf("%d" ,&q);
memset(markc ,0 ,sizeof(markc));
memset(markq ,0 ,sizeof(markq));
int ss = 0;
for(i = 1 ;i <= q ;i ++)
{
scanf("%d" ,&a);
if(!markq[a]) ss ++;
markq[a] = 1;
}
int L ,R ,nowsum ,Ans;
L = 1 ,nowsum = 0 ,Ans = n;
//找到LR
for(i = 1 ;i <= n ;i ++)
{
if(markq[num[i]])
{
if(!markc[num[i]]) nowsum ++;
markc[num[i]] ++;
if(nowsum == ss)
{
R = i;
break;
}
}
}
Ans = R - L + 1;
for(i = L ;i <= n ;i ++)
{
if(markq[num[i]])
if(!(--markc[num[i]]))
{
int ok = 0;
for(int j = R + 1 ;j <= n ;j ++)
{
if(markq[num[j]])
{
markc[num[j]] ++;
if(num[j] == num[i])
{
ok = 1;
R = j;
break;
}
}
}
if(!ok) break;
}
if(Ans > R - i) Ans = R - i;
}
printf("%d\n" ,Ans);
}
}
return 0;
}
hdu2158 最短区间版大家来找碴的更多相关文章
- hdu 2158 最短区间版大家来找碴(尺取法)
Problem Description 给定一个序列,有N个整数,数值范围为[0,N).有M个询问,每次询问给定Q个整数,可能出现重复值.要求找出一个最短区间,该区间要包含这Q个整数数值.你能找的出来 ...
- Justoj 2388最短区间 贪心
2388: 最短区间 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description 有M种不同颜色的气球 ...
- Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)
Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...
- ubuntu下安装jdk(rpm版)错误: 找不到或无法加载主类 解决方法
1.官网下载jdk,linux64位,rpm格式的. 2.提取下载的文件,提取到一个目录下,我的是提取到了usr目录下了 3.终端输入:sudo gedit ~/.bashrc 会打开一个文本,在文本 ...
- 生日礼物 HYSBZ - 1293 【单调队列】【求最短区间的长度,区间需要满足包含所有颜色种类】
生日礼物 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在 ...
- 小米笔记本pro版bios经常找不到硬盘
自从买了小米笔记本,对小米的印象大大折扣,bios经常找不到硬盘,关机,重启,就好了. 到小米售后,售后说是系统坏了,我说bios里都找不到.他说,系统坏了也会出现这个情况.我说好吧.重做后,没用几天 ...
- mysql5.7绿色版配置以及找不到 mysql服务问题解决
一.下载软件 1. 进入mysql官网,登陆自己的Oracle账号(没有账号的自己注册一个),下载Mysql-5.7.17,下载地址:http://dev.mysql.com/downloads/my ...
- hdu2158
最短区间版大家来找碴 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- [LeetCode] Find Right Interval 找右区间
Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...
随机推荐
- C#的foreach遍历循环和隐式类型变量
C#的foreach遍历循环和隐式类型变量 foreach遍历循环 foreach (<baseType> <name> in <array>>) { //c ...
- C# 应用 - 多线程 5) 死锁
两个线程中的每一个线程都尝试锁定另外一个线程已锁定的资源时,就会发生死锁. 两个线程都不能继续执行. 托管线程处理类的许多方法都提供了超时设定,有助于检测死锁. 例如,下面的代码尝试在 lockObj ...
- 02-Spring配置文件加载
获取IOC容器 加载.解析xml文件,形成GenericBeanDefinition,供后续实例化剩下的所有 Bean 使用. obtainFreshBeanFactory() 获取IOC容器 pro ...
- web实现时钟效果
纯原生开发时钟效果,话不多说直接上代码. HTML标签部分 <div class="cricles"> <div class="poin ...
- Java 并发编程之 Condition 接口
本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...
- PTA 中序输出度为1的结点
6-9 中序输出度为1的结点 (10 分) 本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树中度为1的结点. 函数接口定义: void InorderPrintNodes( BiTree T ...
- vue文本滚动组件
看了好多网上的文本组件,发现好多都有这样那样的问题:特别是滚动的时候失真的感觉,今天整合了文本滚动的方式用CSS的 animation写出一套组件:VUE项目直接用.感觉有用的朋友关注下 效果图, ...
- OpenCV图像处理中“投影技术”的使用
本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...
- PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642
PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...
- C++并发与多线程学习笔记--基本概念和实现
基本概念 并发 可执行程序.进程.线程 学习心得 并发的实现方法 多进程并发 多线程并发 总结 C++标准库 基本概念 (并发.进程.线程)区分C++初级编程和中高级编程 并发 两个或者更多的任务同时 ...