日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

I love max and multiply HDU - 6971(详细解答)

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I love max and multiply HDU - 6971(详细解答) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

I love max and multiply HDU - 6971

題意:

數(shù)組a和b,現(xiàn)在構(gòu)造一個(gè)數(shù)組c,使得c[k]=max(a[i] * b[j]) , i&j>=k
求數(shù)組c的和

題解:

我們可以考慮求出所有Dk=max(Ai * Bj)并滿(mǎn)足i&j=k,然后再?gòu)暮笙蚯叭?#xff0c;但是i&j=k不好求,那就改成Dk=max(Ai * Bj),滿(mǎn)足k∈i&j
k∈i&j,我們可以分別求k∈i和k∈j的情況
就比如:
k = 1010,k∈i&j,
i&j可以是:
1010
1011
1110
1111
那么我們就讓i和j分別取這幾個(gè)值求最大值,因?yàn)轭}目中存在負(fù)數(shù),負(fù)數(shù)乘負(fù)數(shù)可能值更大,所以我們同時(shí)記錄Ai和Bj的最大值和最小值
在代碼實(shí)現(xiàn)中,當(dāng)我們循環(huán)到1010,我們就將其值賦給其子集,這樣就實(shí)現(xiàn)了k屬于i&j
最后記得從后向前取最大(為什么還要這步呢?就比如k=1010,我們當(dāng)前得到的最大值是1010所屬于的集合,但是有些集合大于k但是k不屬于,如果i<j,那么j的集合一定大于i,所以j的集合也是滿(mǎn)足i的條件的,反之不一定,所以倒著賦值)

代碼:

#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=1000010,mod=998244353,INF=0x3f3f3f3f; const double eps=1e-6;int n; int a[N],b[N]; LL mx1[N],mx2[N],mi1[N],mi2[N],c[N]; void solve(){scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++) scanf("%d",&b[i]);int all=(int)log2(n)+1;for(int i=0;i<1<<all;i++) {mx1[i]=mx2[i]=-INF;mi1[i]=mi2[i]=INF;c[i]=-1e18;}for(int i=0;i<n;i++) mx1[i]=mi1[i]=a[i];for(int i=0;i<n;i++) mx2[i]=mi2[i]=b[i];for(int i=0;i<all;i++) {for(int j=0;j<1<<all;j++) {if(j>>i&1) {mx1[j^(1<<i)]=max(mx1[j^(1<<i)],mx1[j]);}}}for(int i=0;i<all;i++) {for(int j=0;j<1<<all;j++) {if(j>>i&1) {mi1[j^(1<<i)]=min(mx1[j^(1<<i)],mx1[j]);}}}for(int i=0;i<all;i++) {for(int j=0;j<1<<all;j++) {if(j>>i&1) {mx2[j^(1<<i)]=max(mx2[j^(1<<i)],mx2[j]);}}}for(int i=0;i<all;i++) {for(int j=0;j<1<<all;j++) {if(j>>i&1) {mi2[j^(1<<i)]=min(mi2[j^(1<<i)],mi2[j]);}}}LL now=1ll*INF*INF;for(int i=0;i<n;i++) {if(mx1[i]!=INF&&mx2[i]!=INF) c[i]=max(c[i],mx1[i]*mx2[i]);if(mi1[i]!=-INF&&mi2[i]!=-INF) c[i]=max(c[i],mi1[i]*mi2[i]); if(mx1[i]!=INF&&mi2[i]!=-INF) c[i]=max(c[i],mx1[i]*mi2[i]);if(mi1[i]!=-INF&&mx2[i]!=INF) c[i]=max(c[i],mi1[i]*mx2[i]);}for(int i=n-2;i>=0;i--) c[i]=max(c[i],c[i+1]);LL ans=0;for(int i=0;i<n;i++) ans+=c[i]%mod,ans+=mod,ans%=mod;printf("%lld\n",ans); } int main() {int T; scanf("%d",&T);while(T--) {solve(); }return 0; }

總結(jié)

以上是生活随笔為你收集整理的I love max and multiply HDU - 6971(详细解答)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。