首页 > 其他 > 详细

FJUT-ACM 寒假作业第1周A题

时间:2017-01-19 00:41:21      阅读:512      评论:0      收藏:0      [点我收藏+]

二分强化——全面查询

TimeLimit:2000MS  MemoryLimit:128MB

64-bit integer IO format:%I64d

 

给出一个从递增的正整数序列a0,a1……an-1
对不同的查询输出对应结果

Intput

只有一组数据
第一行是一个整数n,代表序列的长度(下标从0开始一直到n-1)
接下来n个整数,代表序列对应位置上的数
再接下来一行是一个整数m代表查询次数
接下来m行
接下来的每行是这5种类型之一
0 x    代表查询数字x出现的最大下标,若不存在x输出-1
1 x    代表查询数字x出现的最小下标,若不存在x输出-1
2 x y    代表查询大于等于x且小于等于y的数字的个数,并保证x<=y
3 x    代表查询比x大且下标最小的数字的大小,若不存在比x大的数字输出-1
4 x    代表查询比x小且下标最大的数字的大小,若不存在比x小的数字输出-1
n,m<10^5
0<=ai,x,y<10^9

Output

输出对应结果,每个结果占一行

SampleInput

10

1 1 1 3 4 5 5 5 5 8

5

0 5

1 5

2 1 5

3 4

4 8

SampleOutput

8

5

9

5

5

 

 

思路:

  这道题看似很复杂,实际上不然。

  首先对于数据的量和数据大小来说,用int肯定是会爆炸的,所以不可避免的要使用long long。同理,在如此庞大的数据量下,使用枚举妥妥超时,这就需要用到二分的思想。

  对于这5种可能的输入,我们将其一个一个细化,可以发现实际上就是寻找目标数字的最小下标和最大下标。简单的来说,我们只需要用两个函数来分别寻找目标数字的上限和下限。

  对于0和1,只需要简单的使用这两个函数,但是需要注意某些特殊的情况,就是题目中所说的目标数字不存在的情况。具体的写法这里不做描述,留给你们自己思考的空间。

  那么对于2而言,实际上只需要找到x的最小下标和y的最大下标,然后就能够得到满足题目要求的区间。

  对于3,只需要找到x的最大下标,然后视情况下标+1,或者输出-1;

  同理,4也是相似的做法。

  以下是核心代码,请不要直接使用,一定要明白意思,再自己写一遍自己觉得顺手的:

技术分享

 

PS:可能还会有更新。。。

 

FJUT-ACM 寒假作业第1周A题

原文:http://www.cnblogs.com/FirePegasus/p/6298360.html

(0)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!