分享一个题目

DeDeWo 2012-10-06 09:54:30
已知一个有n个元素的数组 arr[1....n] 。 ( 1 < = n < = 100 w )
如果在数组的某个区间[a,b]( 也就是 arr[a]...arr[b] )中有一个数出现的次数超过这个区间[a,b]大小的50%,
那么称这个数叫fuck数。
对于M ( 1 < = M < = 100 w )次询问,每次询问输入两个数为A,B,要求输出数组arr的子区间arr[A...B]中的fuck数,如果不存在输出none。



...全文
273 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
static163 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

搞定了,随机选取100次即可,误差为(1/2)^100 ,可以忽略不计。

散分
[/Quote]
误差是这么算的?那正确率呢
DeDeWo 2012-10-10
  • 打赏
  • 举报
回复
搞定了,随机选取100次即可,误差为(1/2)^100 ,可以忽略不计。

散分
huangxy10 2012-10-07
  • 打赏
  • 举报
回复
也可以用hash存,关键字为a,b.
只存有fuck数的区间,所以应该不多。
毕竟大部分区间没有fuck数。
huangxy10 2012-10-07
  • 打赏
  • 举报
回复
先做一个预处理,计算出所有的区间的[a,b]的fuck数,
时间复杂度是O(n^2);
每一次查询的时间复杂度是O(1)
只是空间复杂度要求比较高O(n^2),内存不够就放到小文件中,
然后根据a,b计算出在哪个文件中,读出来即可。
DeDeWo 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

先做一个预处理,计算出所有的区间的[a,b]的fuck数,
时间复杂度是O(n^2);
每一次查询的时间复杂度是O(1)
只是空间复杂度要求比较高O(n^2),内存不够就放到小文件中,
然后根据a,b计算出在哪个文件中,读出来即可。
[/Quote]

用这么暴力的算法能解决的就不会放到这里分享了
DeDeWo 2012-10-07
  • 打赏
  • 举报
回复
放假了,这里没什么人气啊
DeDeWo 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你是想达到O(Mlogn)吧,
就是每次查询需要logn次?
[/Quote]

是的,O(Mlog(B-A)), 每次查询需要 log(B-A) ,复杂度比这个多一两个数量级也是可以的。
DeDeWo 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你是想达到O(Mlogn)吧,
就是每次查询需要logn次?
[/Quote]

logn 或 nlogn + mlogm 等复杂度是可以接受的 。但不能接受 O(n^2)的算法。
huangxy10 2012-10-07
  • 打赏
  • 举报
回复
你是想达到O(Mlogn)吧,
就是每次查询需要logn次?
DeDeWo 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

使用ST算法可以做,用DP,
记录每个区间最多出现数字的次数.
[/Quote]

RMQ算法太耗内存,并且并不适用这个题目,这题就如一楼说的,可以直接抽象成,arr[A...B]中,出现次数超过一半的数?

考虑最坏的情况 ,A和B相差很大。
有木有复杂度在 O ( nlogn )级别的算法。
huangxy10 2012-10-07
  • 打赏
  • 举报
回复
使用ST算法可以做,用DP,
记录每个区间最多出现数字的次数.
huangxy10 2012-10-07
  • 打赏
  • 举报
回复
如果要想达到O(1)的查询时间复杂度,那么一定是要把所有的区间的fuck数存起来的。
当然预处理方法的时间复杂度可以使用高效一些的方法来加数,也许可以达到线性也说不定。
可以参考RMQ问题,
查询任意区间最大最小值问题。
很类似。
DeDeWo 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

是否可以直接抽象成,arr[A...B]中,出现次数超过一半的数?

如果可以,那只要遍历一次从arr[A] 到 arr[B],时间复杂度为O(n)

方法参考:http://blog.yidooo.net/archives/3426.html
[/Quote]

这种解法只适合询问一个区间,如果有多次询问是不是都要遍历一次?显然这样复杂度高的不靠谱。
  • 打赏
  • 举报
回复
是否可以直接抽象成,arr[A...B]中,出现次数超过一半的数?

如果可以,那只要遍历一次从arr[A] 到 arr[B],时间复杂度为O(n)

方法参考:http://blog.yidooo.net/archives/3426.html

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧