傳送門
文章目錄
題意:
思路:
直接求i&j>=ki\And j>=ki&j>=k不是很好求,所以轉換成i&j=ki\And j=ki&j=k的情況。
考慮對a,ba,ba,b求一遍超集,讓后從[0,n?1][0,n-1][0,n?1]掃一遍即可得到i&j=ki\And j=ki&j=k的情況,之后取一個后綴最大值,讓后求和即可。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
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
];int main()
{
int _
; scanf("%d",&_
);while(_
--) {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
);}return 0;
}
總結
以上是生活随笔為你收集整理的HDU - 6971 K - I love max and multiply sosdp的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。