问题标题: 酷町堂:不要脸的我又双叒叕来问问题了

0
0
已解决
龙舟
龙舟
高级光能
高级光能

1754   序列询问经验值:1200

题目描述 Description

给一个长度为 n 的单调增的正整数序列,即序列中每一个数都比前一个数大。

对该序列进行 m 次询问,每次询问一个数 x,问序列中最后一个小于等于 x 的数是多少?

输入描述 Input Description

第一行:整数 n m,分别表示序列长度和询问次数
第二行:n 个数组成的单调增序列
接下来m行:每次询问用的数 x

输出描述 Output Description

输出:m行,每行表示该序列中最后一个小于等于 x 的数是的大小。

假如找不到这个数则输出 -1。

样例输入 Sample Input

5 3 1 2 3 4 6 5 1 3

样例输出 Sample Output

4 1 3

数据范围及提示 Data Size & Hint

1 <= n,m <=100000

序列中的元素及 x 的大小都 <= 10^6


0
已采纳
陶旭杰
陶旭杰
中级光能
中级光能

作为蒟蒻的我来回答问题啦!

代码分为两个部分:

①将n个数存进桶中

这个不需要多说了吧,直接t[a]++就行了,不过要注意桶的大小为十万多一点。

②关键的来了,进行m次操作。

对于一个x,我们可利用while循环不断往前查找,直到t[x]不为0(即数组中有该数)

对于递减过后的x,如果大于0则输出x;如果小于0则说明数组中不存在这个数,输出-1。

PS:语文不好,请见谅。。。

while(m--){
    int x;
    cin>>x;
    while(!t[x]&&x>=1) x--;
    if(x>=1) cout<<x<<endl;
    else cout<<-1<<endl;
}

 

0
0
赵逸凡
赵逸凡
初级启示者
初级启示者

x<=10^6、m<=10000,标算理论上是二分:mid往左取,O(n log n m)

但知识点是“桶的应用”,或许O(n m)复杂度?(考虑最坏情况)那就存单调递增序列的元素,然后从a[x]往下放缩查找数量不为0的a

赵逸凡在2020-07-08 18:32:42追加了内容

@黄子扬 单纯的找会爆时间吧,应该加优化

0
0
李瑞曦
李瑞曦
高级天翼
高级天翼

e...这个我张口吕品㗊就来····

0
刘英杰
刘英杰
新手天翼
新手天翼

直接输出-1,十分到手(doge)

 

0
我要回答