제출 #32178

#제출 시각아이디문제언어결과실행 시간메모리
32178minchurlBali Sculptures (APIO15_sculpture)C++11
100 / 100
749 ms5068 KiB
#include<stdio.h>
#define LL long long
#define MAX_N 2005
#define inf (1LL<<60)
#define MIN(x,y) ((x)<(y)?(x):(y))
LL ans,e;
LL arr[MAX_N],t[MAX_N];
bool sp_t[MAX_N][MAX_N];
LL N,A,B;
bool sp=false;
bool sp_is_ok(LL x){
	LL i,j,k,sum,y,z;
	LL end_point;
	for(i=0;i<=N;i++){
		for(j=0;j<=i;j++)	sp_t[i][j]=false;
	}
	sp_t[0][0]=true;
	if(x>=0)	ans+=(1LL<<x);
	y=(ans&-ans);
	for(i=1;i<=N;i++){
		sum=0;
		for(j=i;j>=1;j--){
			sum+=arr[j];
			z=sum;
			if(x>=0){z=sum|(y-1);z++;z-=y;}
			z|=ans;
			if(z!=ans)	continue;
			end_point=MIN(j,B);
			for(k=0;k<end_point;k++){
				if(sp_t[j-1][k]==true)	sp_t[i][k+1]=true;
			}
		}
	}
	if(x>=0)	ans-=(1LL<<x);
	for(i=A;i<=B;i++){
		if(sp_t[N][i]==true)	return true;
	}
	return false;
}

bool is_ok(LL x){
	LL i,j,sum,y,z;
	if(sp==true)	return sp_is_ok(x);
	for(i=1;i<=N;i++)	t[i]=inf;
	t[0]=0;
	if(x>=0)	ans+=(1LL<<x);
	y=(ans&-ans);
	for(i=1;i<=N;i++){
		sum=0;
		for(j=i;j>=1;j--){
			sum+=arr[j];
			z=sum;
			if(x>=0){z=sum|(y-1);z++;z-=y;}
			z|=ans;
			if(z!=ans)	continue;
			t[i]=MIN(t[i],t[j-1]+1);
		}
	}
	if(x>=0)	ans-=(1LL<<x);
	if(t[N]>B)	return false;
	else	return true;
}
LL bin_search(){
	LL s=0,mid;
	bool x;
	while(s<=e){
		mid=(s+e)/2;
		x=is_ok(mid);
		if(x==true){
			if(is_ok(mid-1)==false)	return mid;
			else	e=mid-1;
		}else{
			if(is_ok(mid+1)==true)	return mid+1;
			else	s=mid+1;
		}
	}
	return -1;
}
int main(){
	LL i,x;
	scanf("%lld %lld %lld",&N,&A,&B);
	for(i=1;i<=N;i++){
		scanf("%lld",&arr[i]);
	}
	if(A!=1)	sp=true;
	e=51;
	ans=(1LL<<56);
	while(e>=0){
		x=bin_search();
		if(x==-1 || x==e+1)	break;
		ans|=(1LL<<(x));
		e--;
	}
	ans-=(1LL<<56);
	printf("%lld\n",ans);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sculpture.cpp: In function 'int main()':
sculpture.cpp:81:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld %lld %lld",&N,&A,&B);
                                  ^
sculpture.cpp:83:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld",&arr[i]);
                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...