题目名称 2590. 按位或最大值
输入输出 or_max.in/out
难度等级 ★★★☆
时间限制 3000 ms (3 s)
内存限制 256 MiB
测试数据 10
题目来源 GravatarFoolMike 于2017-01-15加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:19, 提交:26, 通过率:73.08%
Gravatarsxysxy 100 0.279 s 5.29 MiB C++
Gravatarsxysxy 100 0.299 s 0.62 MiB C++
Gravatar__stdcall 100 0.346 s 4.29 MiB C++
Gravatar白夜<=>黑天 100 0.362 s 4.10 MiB C++
Gravatar再见 100 0.558 s 5.67 MiB C++
Gravatarshy 100 0.652 s 0.55 MiB Pascal
Gravatarshy 100 0.746 s 0.54 MiB Pascal
GravatarFoolMike 100 0.884 s 8.29 MiB C++
GravatarAntiLeaf 100 0.927 s 8.29 MiB C++
Gravatarkito 100 1.090 s 8.29 MiB C++
关于 按位或最大值 的近10条评论(全部评论)
才学了FWT就看到这个题。。。
大概真的是一道FWT水题。。。
Gravatar__stdcall
2017-09-08 08:03 8楼
听说随机化可以搞过去。shy写了下发现不随机都可以。比如暴力找每个数后面200(或4000)个or,暴力和最前面200个or之类的。
当然。。。这显然是错的。假设答案由唯一的关键对$(i,j)$贡献,那么这个算法和$|i-j|$的值有很大关系。
随便构一组数据:$1..n$全$0$,随机1个位置赋为$1$,再随机1个位置赋为$2$。答案显然是$1\ or\ 2=3$,当然榜上随机的代码(包括我自己的随机代码),这样的数据基本就会错。
理论算下的话,$ \frac{\sum_{i=1}^{n}\sum_{j=1}^{n}(|i-j|)}{n^{2}}=\frac{\sum_{i=1}^{n}(\frac{i(i-1)}{2}+\frac{(n-i)(n-i+1)}{2})}{n^{2}}=\frac{\frac{n^{3}+2n^{2}+2n+1}{3}}{n^{2}} $
代入n=200000的话,期望长度有66667左右,则这样随机化实际上正确率非常低,其实每个位置暴力找k个or的话,即使不算感觉下正确率大概应在$\frac{k}{n}$。
当然我也只是就事论事,针对性地出一组数据,用其他乱搞的随机方法就不知道了。。但是理论上不加剪枝的随机在这题中是很劣的。
Gravatarshy
2017-05-31 13:27 7楼
= =随机化太玄学了,60 -> 90 -> 100。莫名其妙rk1
Gravatarsxysxy
2017-02-21 09:43 6楼
回复 @AntiLeaf :
思路是这样的。设全集为U,我们把每个集合的子集都看作是一个可取的集合,这样可取集合的求法可以参照集合卷积的逆运算。之后我们进行一次集合卷积,求出子集于每个集合S的最大集合Max[S](即化为二进制数最大),最后我们枚举可取的集合S,则如果取了S,则答案最大为S|Max[U^S]。
GravatarFoolMike
2017-01-16 19:24 5楼
回复 @Mike is Fool :
然而没看懂标程......
GravatarAntiLeaf
2017-01-16 14:10 4楼
大家都是随机化而没有利用那个ai<=2^20的条件吗?我的标程是O(n+20*2^20)的
GravatarFoolMike
2017-01-16 12:56 3楼
随机化肛过去了= =
把区间随机打乱之后只统计每个位置和后面4582个位置的或值,
时间复杂度是$O(n*log^3n)$的
因为常数极小所以可以过去
(对Mike深表歉意,毕竟好好做了数据)
GravatarYGOI_真神名曰驴蛋蛋
2017-01-16 08:45 2楼
%拜神犇Mike
Gravatar白夜<=>黑天
2017-01-16 07:54 1楼

2590. 按位或最大值

★★★☆   输入文件:or_max.in   输出文件:or_max.out   简单对比
时间限制:3 s   内存限制:256 MiB

【题目描述】

给你n个正整数,求两两之间按位或的最大值。

【输入格式】

第一行是一个整数n。第二行是那n个正整数。

【输出格式】

输出这些正整数两两之间按位或的最大值。

【样例输入】

10
28706 60064 135248 410188 791809 443009 436897 445122 287440 907266

【样例输出】

1047203

【提示】

对于30%的数据,n=1000

对于另外30%的数据,n=100000且正整数不超过2^10

对于所有数据,n<=100000且正整数不超过2^20

数据真的不好造,谁有更强的数据就来换一下吧。

会做此题的神犇一定要发题解。

Mike位运算题组T1