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 nlognn<=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的主要内容,如果未能解决你的问题,请参考以下文章

Splay 区间反转

Face The Right Way思维。。。

反转链表 II 区间反转

反转(开关问题)

子序列-反转区间求最长不下降子序列

863D - Yet Another Array Queries Problem(思维)