描述

给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大。其中AND是按位与操作。

小Ho当然知道怎么做。现在他想把这个问题交给你。

输入

第一行一个数T,表示数据组数。(1 <= T <= 10)

对于每一组数据:

第一行一个整数N(1<=N<=100,000)

第二行N个整数A1, A2, A3, ... A(0 <= A<220)

输出

一个数表示答案

样例输入

2
3
1 2 3
4
1 2 4 5

样例输出

12
80

思路:Ai*Aj*(Ai&Aj)我们枚举第三部分,假设第三部分为x=Ai&Aj,然后我们取x的超集的最大值和次大值即可。

对于每个Ai我们可以枚举子集,用Ai取更新子集的最大次大值。4777ms;

#include<bits/stdc++.h>
using namespace std;
const int maxn=(<<)+;
int Mx[maxn],Se[maxn]; long long ans;
int main()
{
int T,N,x;
scanf("%d",&T);
while(T--){
memset(Mx,,sizeof(Mx));
memset(Se,,sizeof(Se));
scanf("%d",&N);
for(int i=;i<=N;i++){
scanf("%d",&x);
for(int j=x;j;j=(j-)&x){
if(x>Mx[j]){
Se[j]=Mx[j]; Mx[j]=x;
}
else if(x>Se[j]) Se[j]=x;
}
}
ans=;
for(int i=;i<maxn;i++) ans=max(ans,(long long)i*Mx[i]*Se[i]);
printf("%lld\n",ans);
}
return ;
}

也可以利用高维前缀和来维护最大次大值。1586ms。

(目前见到的三种:高维前缀和维护了X集之和,位置的最小值,最大次大值。ORZ

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=<<;
int Mx[maxn+],Se[maxn+]; ll ans;
int main()
{
int T,N,x;
scanf("%d",&T);
while(T--){
memset(Mx,,sizeof(Mx));
memset(Se,,sizeof(Se));
scanf("%d",&N);
for(int i=;i<=N;i++){
scanf("%d",&x);
if(x>Mx[x]) Mx[x]=x;
else Se[x]=x;
}
for(int i=;i<;i++){
for(int j=;j<maxn;j++){
if(!(j&(<<i))){
if(Mx[j|(<<i)]>=Mx[j]){
Se[j]=max(Mx[j],Se[j|(<<i)]);
Mx[j]=Mx[j|(<<i)];
}
else Se[j]=max(Mx[j|(<<i)],Se[j]);
}
}
}
ans=;
for(int i=;i<maxn;i++) ans=max(ans,(ll)i*Mx[i]*Se[i]);
printf("%lld\n",ans);
}
return ;
}

HihoCoder - 1496:寻找最大值(高维前缀和||手动求子集)的更多相关文章

  1. Hihocoder 1496 寻找最大值(状态压缩 + 高位前缀和)

    题目链接  Hiho 1496 设$f[i]$为二进制集合包含$i$的最大的两个数,这个东西用高维前缀和维护. 高位前缀和转移的具体方案 :枚举每一位,然后枚举每个集合,大的转移到小的. 注意合并的时 ...

  2. hihocoder 1496 寻找最大值

    题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...

  3. hihocoder 1496 寻找最大值(高维前缀最大次大值)

    [题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠ ...

  4. BZOJ:5092 [Lydsy1711月赛]分割序列(贪心&高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b _2 xor...xor ...

  5. HihoCoder 1496:寻找最大值(思维DP)

    http://hihocoder.com/problemset/problem/1496 题意:中文. 思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时 ...

  6. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

  7. Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望

    传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...

  8. hihocoder1496(高维前缀和)

    题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N( ...

  9. [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)

    [luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...

随机推荐

  1. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  2. w3c标准盒模型与IE传统模型的区别

    一.盒子模型(box model) 在HTML文档中的每个元素被描绘为矩形盒子.确定其大小,属性——比如颜色.背景.边框,及其位置是渲染引擎的目标. CSS下这些矩形盒子由标准盒模型描述.这个模型描述 ...

  3. java, double转String, 去掉0结尾的小数位

    小问题:double值的小数位是0时,转String会有“.0”结尾.比如,double值是“12”,转String得到的字符串是“12.0”.如果需要去掉0结尾的小数位,应当如何解决呢? 解决方案: ...

  4. 在win7虚拟机中装sql server---待整理

    本科学数据库的时候,为了做作业,需要在自己电脑上装sql server.但是每次都装不上,总是有各种小问题通不过.最后问学长,才采用了在虚拟机里装数据库的方法,在虚拟机中可以不用担心弄乱本机系统. 为 ...

  5. 解决Mybatis配置ORM映射 时分秒都为0

    方法一: Date类型的类成员变量使用java.sql.Timestamp 方法二: Mybatis的映射配置javatype=Timestamp.class

  6. Light oj 1379 -- 最短路

    In Dhaka there are too many vehicles. So, the result is well known, yes, traffic jam. So, mostly peo ...

  7. Linux 系统启动过程,Linux 系统目录结构

    一.Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立 ...

  8. MYSQL freedata 外联接

    主要是解决,不同生产系统里面,有不同的数据库. SQL 又不能夸系统查询表. 只能在一个系统里,可以跨不同的数据库查表. 所以会用映射 .FREEDATA 这种方式,这样A 系统 里的表更新之后,就可 ...

  9. 【Seajs源码分析】1. 整体架构

    seajs是一个非常流行的模块开发引擎,目前项目中使用比较多,为了深入了解已经改进seajs我阅读了他的源码,希望对自己的代码生涯能有所启发. 本文说介绍的是指seajs2.3.3版本. 首先seaj ...

  10. JUnit出错,却没有显示任何报错信息【待解答】

    JUnit测试代码如下: 原因分析: JUnit测试单元里,测试函数好像不能带参数? 解决办法: 发现测试函数testBookShopDaoUpdateBookStock(int isbn)里的参数i ...