关注
第一题没什么好说的。 第二题本人想到了2种方法(笔试中用第一种方法AC了)。 方法1:用map或者有序数列二分查询来将喜好程度离散化(离散化后每个喜好程度对应1~n的一个数),建立一个数组cnt,保存每个数出现的次数。 将问题按区间左界升序排序,则问题也一定是按区间右界升序的(题目中有说明)。对于每个问题,直接去cnt数组中查询可得到结果。 对于2个相邻的问题,设区间为[L1 , R1] 和[ L2 ,R2 ],则我们需要使cnt数组减去[ L1 ,L2 )区间内所有的喜好程度数量,加上( R1, R2]区间内所有的喜好程度数量。则下一个问题也直接能从cnt数组中查询。 结束之后,将所有的问题按提问顺序排序并输出。 总时间复杂度为O(nlogn+q)。 方法2:建立一棵普通的线段树,线段树初始状态为全0。用来查询区间的数量总和。用将问题和用户都按喜好程度升序排序。对于一批喜好程度为k的问题,将所有喜好程度为k的用户,以权值1存入线段树,并用线段树得出这批问题的结果;然后将所有喜好程度为k的用户,以权值-1存入线段树(相当于删除原来对线段树的改动)此时线段树变成全0的初始状态,然后继续处理下一批。 结束之后,将所有的问题按提问顺序排序并输出。 由于每个元素仅有2次存入线段树的操作(权值分别为1和-1),每个问题q以logn的复杂度得到结果,再考虑排序耗费的时间,总时间复杂度为O((n+q)logn+qlogq)。 点评:方法1和方法2的复杂度均为nlogn级别的,在此题的数据量下并不会超时。方法1的实现更为简单,但其利用了题目中对与区间的限定,而方法2的实现稍为复杂,但并不需要题目的特殊约定。
查看原帖
点赞 3
相关推荐
05-26 00:05
门头沟学院 运维开发工程师 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 要毕业了,再不说就来不及了 #
27143次浏览 348人参与
# 我的租房踩坑经历 #
226711次浏览 1193人参与
# 第3届现代汽车Code Faster急速编程挑战赛 #
3814次浏览 194人参与
# 蔚来工作体验 #
35702次浏览 94人参与
# 你觉得什么岗位会被AI替代 #
67907次浏览 393人参与
# 国企/银行/研究所公司爆料 #
221232次浏览 940人参与
# 你都用AI做什么 #
56877次浏览 536人参与
# 0offer是寒冬太冷还是我太菜 #
1819303次浏览 10765人参与
# 体制内上岸心路历程 #
41373次浏览 243人参与
# 春招/暑实第一面是哪家? #
115580次浏览 1212人参与
# 求职遇到的搞笑事件 #
206213次浏览 1070人参与
# 春招你拿到offer了吗 #
939565次浏览 10328人参与
# 你是怎么和mt相处的? #
112581次浏览 588人参与
# 找工作时遇到的神仙HR #
1256875次浏览 5963人参与
# 牛友の3月总结 #
59244次浏览 287人参与
# 你都收到了哪些公司的感谢信? #
5519375次浏览 36250人参与
# xxx岗位的一天 #
58151次浏览 290人参与
# 我的第一份实习怎么找的 #
294430次浏览 2122人参与
# 第一次面试 #
1157670次浏览 13954人参与
# 数据人offer决赛圈怎么选 #
383146次浏览 2985人参与
# 比亚迪求职进展汇总 #
946738次浏览 3168人参与