HihoCoder - 1496:寻找最大值(高维前缀和||手动求子集)
描述
给定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, ... AN (0 <= Ai <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:寻找最大值(高维前缀和||手动求子集)的更多相关文章
- Hihocoder 1496 寻找最大值(状态压缩 + 高位前缀和)
题目链接 Hiho 1496 设$f[i]$为二进制集合包含$i$的最大的两个数,这个东西用高维前缀和维护. 高位前缀和转移的具体方案 :枚举每一位,然后枚举每个集合,大的转移到小的. 注意合并的时 ...
- hihocoder 1496 寻找最大值
题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...
- hihocoder 1496 寻找最大值(高维前缀最大次大值)
[题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠ ...
- 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 ...
- HihoCoder 1496:寻找最大值(思维DP)
http://hihocoder.com/problemset/problem/1496 题意:中文. 思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时 ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望
传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...
- hihocoder1496(高维前缀和)
题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N( ...
- [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)
[luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...
随机推荐
- 【jdk源码分析】java多线程开启的三种方式
1.继承Thread类,新建一个当前类对象,并且运行其start()方法 package com.xiaostudy.thread; /** * @desc 第一种开启线程的方式 * @author ...
- 通过SSH key获取GitHub上项目,导入到IDEA中
1.在Windows上安装Git 在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可 安装完成后,在开始菜单里找到“Git”->“Git Bash”,或者在文 ...
- 【转】R语言知识体系概览
摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...
- Angular内提供了一个可以快速建立测试用web服务的方法:内存 (in-memory) 服务器
如何使用 Angular 内存 (in-memory) 服务器https://segmentfault.com/a/1190000009898540
- BOM(Browser Object Model) 浏览器对象模型
JavaScript 实现是由 3 个部分组成:核心(ECMAScript),文档对象模型(DOM),浏览器对象模型(BOM) BOM(Browser Object Model) 浏览器对象模型BOM ...
- asp.net服务器上无法发送邮件的问题
前几天为开发的网站做了个发送邮件的功能,但是部署到服务器上无法发送邮件,提示由于目标机器积极拒绝,无法连接.在网上找到了一个解决办法 如果安装了McAfee杀毒软件(按照“手工安装方法”安装),首先需 ...
- IOS UI-瀑布流(UICollectionView)
ViewController.m // // ViewController.m // IOS_0227_瀑布流 // // Created by ma c on 16/2/27. // Copyrig ...
- C#笔记 -- 协变、逆变
协变 理解:在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用由A派生的泛型参数B的类型实例化,(小=> 大)如 // IEnumerable<Animal> 与 Lis ...
- gzip压缩解压缩
压缩/解压缩压缩/解压缩之后的文件名称 必须是gz 解压缩
- LeetCode OJ:Isomorphic Strings(同构字符串)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...