1. 程式人生 > >hihocoder1496-高維字首和|暴力

hihocoder1496-高維字首和|暴力

http://hihocoder.com/problemset/solution/1115709
其實我感覺高維字首本身也是一種暴力(遞推???)。。。
因為&操作不會使1的數量增加,所以我們可以遞推。。
我把他放到動態規劃裡了因為我感覺他也是 壯壓思想。。。
O(∩_∩)O哈哈~
或者有大佬的程式碼,是暴力。但是剪枝了一下
因為i&j的結果 最大是 i和j中大的數
如果這樣還小,那麼就剪掉它。。

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib> #include <cstring> #include <ctime> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> /*高維字首和。 我看別人的程式碼,暴力也能大力ac。。 我感覺這個高維字首和壯壓差不多。 更像是一種模擬。 第一個opreator的手法是 得到當前狀態的最大值和最小值。 若j狀態有i 1<<i&j ==true (dp[1<<i&(j)]=dp[1<<i&(j)]+dp[j])在這兩個狀態中找到最大的兩個數。和程式碼中過載的操作一樣,不要誤會) */
using namespace std; const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; int n; pair<int, int> f[1 << 20]; pair<int, int> operator+(pair<int, int> A, pair<int, int> B) { pair<int, int> ret = A; if(B.first > ret.first) { swap(ret.first, ret.second); ret.first = B.first; } else
if(B.second > ret.second) ret.second = B.second; return ret; } int main() { int t; int m; scanf("%d", &t); while(t--){ for(int i=0;i<1<<20;i++) f[i]={0,0};//初始化咯 scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&n); f[n]=f[n]+make_pair(n,0);//不是1<<n,是n,這個要好好理解。。 } for(int i=0;i<20;i++) for(int j=0;j<1<<20;j++) { if((1<<i)&j) f[j^(1<<i)]=f[j^(1<<i)]+f[j]; } long long ans=-1; for(int i=0;i<1<<20;i++){ ans=max(ans,1ll*f[i].first*f[i].second*i); } cout<<ans<<endl; } return 0; }
#include <bits/stdc++.h>  

using namespace std;  

typedef long long ll;  

ll num[1000010];  

int main( )  
{  
    //freopen ("F:\\CSLeaning\\Thinking in C++\\hihocoder\\in.in", "r", stdin);  
    int t;  
    cin>>t;  
    while ( t-- )  
    {  
        int n;  
        cin>>n;  
        for (int i = 0; i < n; ++i)  
        {  
            cin>>num[i];  
        }  
        sort (num, num+n);  
        ll ans = 0;  
        for (int j = n; j >=0 ; --j)  
        {  
            for (int i = j-1; i >=0 ; --i)  
            {  
                ll tmp_ans = num[i]*num[j];  
                if( tmp_ans*num[j] <= ans )  
                    break;  
                ans = max (ans, tmp_ans*(num[j]&num[i]));  
            }  
        }  
        cout<<ans<<endl;  
    }  
    return 0;  
}  

相關推薦

hihocoder1496-高維字首|暴力

http://hihocoder.com/problemset/solution/1115709 其實我感覺高維字首本身也是一種暴力(遞推???)。。。 因為&操作不會使1的數量增加,所以我

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 b_i)+(b_{i+1} xor b_{i+2} xor...xor b_n))

HihoCoder - 1496:尋找最大值(高維字首||手動求子集)

描述 給定N個數A1, A2, A3, ... AN,小Ho想從中找到兩個數Ai和Aj(i ≠ j)使得乘積Ai × Aj × (Ai AND Aj)最大。其中AND是按位與操作。   小Ho當然知道怎麼做。現在他想把這個問題交給你。 輸入 第一行

牛客網 NOIP賽前集訓營-普及組(第四場)C--部分 (高維字首)

傳送門 解題思路   高維字首和模板題。首先,求字首和有兩種方式,比如說對於求二維字首和來說。 第一種 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-s

高維字首

高維字首和就是求關於一個集合子集(或超集)的狀態的和 牛客有一道題寫的很好 傳送門 題面就已經說明了高維字首和的原理 連結:https://ac.nowcoder.com/acm/contest/167/C 來源:牛客網 對於一個一維陣列求部分和,可以使用如下程式碼 for

bzoj 5092 分割序列 —— 高維字首

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 首先,處理出異或字首和 s[i],i 位置的答案就是 s[j] + s[j]^s[i],j <= i 異或的套路是按位考慮,但是這裡有加法...怎麼考慮進位? 所以就不能考慮答案的這一

bzoj 5092 [Lydsy1711月賽]分割序列——高維字首

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一個字首異或和,就變成 f[ i ]=max_{j=0}^{i} { s[ j ] + (s[ i ]^s[ j ]) }。再套路地考慮按位貪心。 然後看了題解。按位貪心不是確定 f[

SPOJ.TLE - Time Limit Exceeded(DP 高維字首)

題目連結 \(Description\) 給定長為\(n\)的陣列\(c_i\)和\(m\),求長為\(n\)的序列\(a_i\)個數,滿足:\(c_i\not\mid a_i,\quad a_i\&a_{i+1}=0\)。 \(n\leq 50,m\leq 15,0\leq a_i<2^m

BZOJ5092:[Lydsy1711月賽]分割序列(貪心,高維字首)

Description 對於一個長度為n的非負整數序列b_1,b_2,...,b_n,定義這個序列的能量為:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b_i)+(b_{i+1} xor b_{i+2} xor...xor b_n))其中xor表示按

luoguP3175 [HAOI2015]按位或 min-max容斥 + 高維字首

考慮min-max容斥 \(E[max(S)] = \sum \limits_{T \subset S} min(T)\) \(min(T)\)是可以被表示出來 即所有與\(T\)有交集的數的概率的和的倒數 通過轉化一下,可以考慮求所有與\(T\)沒有交集的數的概率和 即求\(T\)的補集的

Time Limit Exceeded(高維字首)

題意 題目連結 題目的意思是給一個數組C,長度為n,每個數字的範圍是2^m,然後要求構造一個數組a,滿足 1、a[i] % C[i] !=0 ; 2、a[i] < 2^m ; 3、a[i] & a[i+1] = 0; Sol 直接dp的話就是先列舉補集的子集,這樣的複雜度是\(3

cf449D. Jzzhu and Numbers(容斥原理 高維字首)

題意 題目連結 給出\(n\)個數,問任意選幾個數,它們\(\&\)起來等於\(0\)的方案數 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到。。 考慮每一種方案 答案=任意一種方案 - 至少有\(1\)位為\(1\)的方案 + 至少有兩位為\(1\)的方案 - 至少有三位為\(1\)的方案

高維字首】SPOJ(TLE)[Time Limit Exceeded]題解

題目概述 題目名稱要不要這麼奇葩而且和題面沒有半毛錢關係啊,我上交題目都以為自己TLE了。 給出 nn 個數 cici ,現在需要構造 aiai 使得: aimodci>0aimodci&

5765 Bonds 高維字首

這題做了好久,,看了網上的題解也看不太懂,,只知道用高維字首做,,,,,,然後在拉粑粑的時候,,突然想出了一種方法 他是要算出每條邊出現在多少割集中,,,我們可以反著想,,我們可以先算出有多少割集(個數設為sum),在算出這條邊包含多少合法聯通塊中(個數設為x),,然後s

TLE Time Limit Exceeded 高維字首

題意:給出長度為n的序列c,求非負整數序列a,滿足a<2^m,並且有a[i]&a[i+1]=0,對於每個a[i],要保證a[i]不是c[i]的倍數,求這樣的a[i]序列的個數 思路:d

Intense Heat-字首暴力求解

【題目】 The heat during the last few days has been really intense. Scientists from all over the Berland study how the temperatures and weath

高維字首學習小記

問題引入: 現有a[i](0&lt;=i&lt;2n)a[i](0&lt;=i&lt;2^n)a[i](0<=i<2n) 對於每一iii,求∑j∈ia[j]\sum_{j∈i}a[j]∑j∈i​a[j] 這裡的∈∈∈指

【題解】洛谷P1315 [NOIP2011TG] 觀光公交(字首+貪心)

次元傳送門:洛谷P1315 思路 思路大概想到了 可是程式碼實現卻沒想到 所以參考題解了 D2T3的貪心果然有難度 我們考慮在每次用加速器有兩種情況 到下一個點還需要等待:以後的時間就不再影響了 到下一個點不需要等待:那麼就會影響到後面的時間直到出現情況1(或者到最後一個點) 用sum

atcoder tenka1 2018 e Equilateral - 字首

題目大意:給一張黑白網格圖,問有多少黑點的無序三元組,兩兩曼哈頓距離相等。300。 題解:轉切比雪夫距離,發現一定有至少兩個點的連向平行於座標軸。 列舉計算即可,注意等腰直角三角形的情況若不處理會被計兩次。 #include<bits/stdc++.h> #define gc