题意:

                 最短区间版大家来找碴

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 最短区间版大家来找碴的更多相关文章

  1. hdu 2158 最短区间版大家来找碴(尺取法)

    Problem Description 给定一个序列,有N个整数,数值范围为[0,N).有M个询问,每次询问给定Q个整数,可能出现重复值.要求找出一个最短区间,该区间要包含这Q个整数数值.你能找的出来 ...

  2. Justoj 2388最短区间 贪心

    2388: 最短区间 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 有M种不同颜色的气球 ...

  3. Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)

    Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...

  4. ubuntu下安装jdk(rpm版)错误: 找不到或无法加载主类 解决方法

    1.官网下载jdk,linux64位,rpm格式的. 2.提取下载的文件,提取到一个目录下,我的是提取到了usr目录下了 3.终端输入:sudo gedit ~/.bashrc 会打开一个文本,在文本 ...

  5. 生日礼物 HYSBZ - 1293 【单调队列】【求最短区间的长度,区间需要满足包含所有颜色种类】

    生日礼物 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在 ...

  6. 小米笔记本pro版bios经常找不到硬盘

    自从买了小米笔记本,对小米的印象大大折扣,bios经常找不到硬盘,关机,重启,就好了. 到小米售后,售后说是系统坏了,我说bios里都找不到.他说,系统坏了也会出现这个情况.我说好吧.重做后,没用几天 ...

  7. mysql5.7绿色版配置以及找不到 mysql服务问题解决

    一.下载软件 1. 进入mysql官网,登陆自己的Oracle账号(没有账号的自己注册一个),下载Mysql-5.7.17,下载地址:http://dev.mysql.com/downloads/my ...

  8. hdu2158

    最短区间版大家来找碴 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

随机推荐

  1. CentOS7 下 MySQL 5.7.23 & XtraBackup 24 做数据备份(1)——安装软件

    在两台机子上同时操作下面的步骤 首先安装MySQL,从官网下载相对应版本的RPM包 mysql-community-client-5.7.23-1.el7.x86_64.rpm mysql-commu ...

  2. groovy-map.each{}

    ConfigDetail postEdiUrl(TtxSession sess, String code) { return cdSvc.getByRecordTypeAndIdentifier(se ...

  3. 在windows10中启动VmWare时,只要一启动虚拟机,电脑就会蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)

    在windows10中启动VmWare时,只要一启动虚拟机,电脑就会蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION) 没错就是这个,绿色的死亡按钮 原因: 第一种:windows ...

  4. 【.net core】三种注入方式的区别

    AddTransient瞬时模式:每次请求,都获取一个新的实例.即使同一个请求获取多次也会是不同的实例 AddScoped:每次请求,都获取一个新的实例.同一个请求获取多次会得到相同的实例 AddSi ...

  5. get和post的区别主要有以下几方面

    1.url可见性: get,参数url可见: post,url参数不可见 2.数据传输上: get,通过拼接url进行传递参数: post,通过body体传输参数 3.缓存性: get请求是可以缓存的 ...

  6. Azure Cost alerts 费用成本分析

    一,引言 依稀记得在一月初,我们在 Azure 上做成了一个 费用警报的监控,果不其然,前两天 Azure 给我发了两封封 Azure 预警警报的邮件,提醒我的预算的总费用超过了设置的通知阈值 &qu ...

  7. 从零学脚手架(七)---webpack-dev-server使用

    如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli webpack-dev-server使用 什么是webpack-dev-server 使用vue-cli .re ...

  8. SparkSQL中产生笛卡尔积的几种典型场景以及处理策略

    [前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机.那么都有哪些情况会产生笛卡尔积,以及如何事 ...

  9. 2018ICPC南京D. Country Meow

    题目: 题意:三维里有n个点,找一个最小的球将所有点覆盖. 题解:退火法模拟的一道板子题. 1 #include <stdio.h> 2 #include <iostream> ...

  10. 攻防世界 reverse Newbie_calculations

    Newbie_calculations Hack-you-2014 题目名百度翻译成新手计算,那我猜应该是个实现计算器的题目.... IDA打开程序,发现一长串的函数反复调用,而且程序没有输入,只有输 ...