[Apio2015]巴厘岛的雕塑|动态规划

一定要坚信 进制类的题一定是按位贪心!!!!!!!!!!!!

然后就这些了

0.0

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#define T 2002
#define ll long long
using namespace std;
long long sc()
{
	long long i=0; char c=getchar();
	while(c>'9'||c<'0')c=getchar();
	while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
	return i;
}
int ff[2202];
bool f[102][102];
long long a[T],ans=0;
int n,A,B;
void dfs1()
{
	for(int k=60;k;k--)
	{
		memset(f,0,sizeof(f));
		f[0][0]=1;
		for(int i=1;i<=n;i++)
		    for(int j=1;j<=min(i,B);j++)
		    {
		    	for(int s=0;s<i;s++)
		    	    if(f[s][j-1])
		    	    {
		    	    	if(((a[i]-a[s]>>k)|(ans>>k))==(ans>>k))
		    	    	    if((a[i]-a[s]&(1ll<<k-1))==0)
		    	    	    {
		    	    	    	f[i][j]=1;
		    	    	    	break;
		    	    	    }
		    	    }
		    }
		ans+=(1ll<<k-1);
		for(int i=A;i<=B;i++)
		    if(f[n][i])
		    {
		    	ans-=(1ll<<k-1);
		    	break;
		    }
	}
}
void dfs2()
{
	for(int k=60;k;k--)
	{
		memset(ff,-1,sizeof(ff));
		ff[0]=0;
		for(int i=1;i<=n;i++)
		    for(int j=0;j<i;j++)
		        if(ff[j]!=-1)
		    	if(((a[i]-a[j]>>k)|(ans>>k))==(ans>>k))
		    	    if((a[i]-a[j]&(1ll<<k-1))==0)
		    	    {
		    	    	if(ff[i]==-1) ff[i]=ff[j]+1;
		    	    	else ff[i]=min(ff[i],ff[j]+1);
		    	    }
		if(ff[n]==-1||ff[n]>B) ans+=(1ll<<k-1);
	}
}		
int main()
{
	n=sc();A=sc();B=sc();
	for(int i=1;i<=n;i++)a[i]=sc()+a[i-1];
	if(A!=1)dfs1();
	else dfs2();
	cout<<ans;
	return 0;
}



你可能感兴趣的:(动态规划)