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
0
0