CCA的区间 思维sosdp 区间反转trick
Posted goto_1600
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCA的区间 思维sosdp 区间反转trick相关的知识,希望对你有一定的参考价值。
思路:
可以反转一个区间 ,就代表 取两段 互不相交的合法区间,这里互不相交指的是对于任何一个元素,两段区间不存在都有该位的情况,合法也是,然后最大值,由于每个数是二进制位,说明每一段区间长度不超过 24,所以初始值dp[i]=i,如果i能取到,我们可以子集dp代表 i的子集的最大值,然后枚举它的补集,可以发现,这两个刚好不相交,所以不用判断是否相交,
然后复杂度
n
l
o
g
n
,
n
<
=
2
24
n logn,n<=2^24
nlogn,n<=224
code
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int dp[1<<24] ;
//int dp[x];
int main()
int n;
cin>>n;
vector<int>v;
for(int i=0;i<n;i++)
cin>>a[i];
int now=0;
for(int j=i;j>=0 and j>=i-24;j--)
now|=a[j];
v.push_back(now);
for(auto x:v)
dp[x]=x;
for(int i=0;i<24;i++)
for(int j=0;j<=(1<<24)-1;j++)
if(j>>i&1)
dp[j]=max(dp[j],dp[j-(1<<i)]);
int res=0;
for(int i=0;i<1<<23;i++)
res=max(res,dp[i]+dp[(1<<24)-i-1]);
cout << res << endl;
以上是关于CCA的区间 思维sosdp 区间反转trick的主要内容,如果未能解决你的问题,请参考以下文章