寻找最大值

寻找最大值

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定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
分析:高维前缀和思想,维护最大值与次大值;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <cassert>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
const int maxn=1e5+10;
const int N=2e5+10;
using namespace std;
int id(int l,int r){return l+r|l!=r;}
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
int n,m,k,t,cnt[1<<20],ma[1<<20],mi[1<<20];
int main()
{
    int i,j;
    scanf("%d",&t);
    while(t--)
    {
        memset(cnt,0,sizeof(cnt));
        memset(mi,0,sizeof(mi));
        memset(ma,0,sizeof(ma));
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&j),cnt[j]++;
        rep(i,0,(1<<20)-1)
        {
            if(cnt[i]>=1)ma[i]=i;
            if(cnt[i]>=2)mi[i]=i;
        }
        for(i=0;i<20;i++)
        {
            for(j=0;j<(1<<20);j++)
            {
                if((~j)&(1<<i))
                {
                    if(ma[j^(1<<i)]>ma[j])
                    {
                        mi[j]=ma[j];
                        ma[j]=ma[j^(1<<i)];
                    }
                    if(mi[j^(1<<i)]>mi[j])mi[j]=mi[j^(1<<i)];
                }
            }
        }
        ll ret=0;
        rep(i,0,(1<<20)-1)ret=max(ret,(ll)ma[i]*mi[i]*i);
        printf("%lld
",ret);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/6666434.html