神奇错误,蒟蒻求调,玄关
查看原帖
神奇错误,蒟蒻求调,玄关
1291460
under_hole楼主2024/7/12 16:41

同一份代码,当我开O2时:
开O2
不开O2:
不开O2
本地跑正常,求大佬调一下

#include<bits/stdc++.h>
using namespace std;
/*2024/7/12
*question id:1574
*answer:
*idea:
*else:
*/
const int maxn=105;
struct BigInt{
	vector<int> x;
	BigInt(){x.push_back(0);}
	BigInt(int val){
		while(val!=0){
			x.push_back(val%10);
			val/=10;
		}
	}
};
inline void print(BigInt a){
	for(int i=a.x.size()-1;i>=0;i--)printf("%d",a.x[i]);
	return;
}
inline BigInt operator*(BigInt a,BigInt b){
	while(a.x.size()>1&&*a.x.rbegin()==0)a.x.pop_back();
	while(b.x.size()>1&&*b.x.rbegin()==0)b.x.pop_back();
	BigInt ans;
	ans.x.resize(a.x.size()+b.x.size()+10);
	for(int i=0;i<a.x.size();i++)
		for(int j=0;j<b.x.size();j++)ans.x[i+j]+=a.x[i]*b.x[j];
	int i=0;
	while(true){
		if(ans.x.size()-1<i+1){
			if(ans.x[i]==0)break;
			ans.x.push_back(0);
		}
		ans.x[i+1]+=ans.x[i]/10;
		ans.x[i++]%=10;
	}
	while(*ans.x.rbegin()==0)ans.x.pop_back();
	//print(a),printf(" * "),print(b),printf(" = "),print(ans),printf(" \n");
	return ans;
}
inline BigInt operator *(BigInt a,int b){
	//print(a),printf(" * ");
	for(int i=0;i<a.x.size();i++)a.x[i]*=b;
	int i=0;
	while(true){
		if(a.x.size()-1<i+1){
			if(a.x[i]==0)break;
			a.x.push_back(0);
		}
		a.x[i+1]+=a.x[i]/10;
		a.x[i++]%=10;
	}
	while(*a.x.rbegin()==0)a.x.pop_back();
	//printf("(int)%d = ",b),print(a),printf(" \n");
	return a;
}
inline BigInt operator+(BigInt a,BigInt b){
	while(a.x.size()>1&&*a.x.rbegin()==0)a.x.pop_back();
	while(b.x.size()>1&&*b.x.rbegin()==0)b.x.pop_back();
	BigInt ans;
	int asize=a.x.size();
	int bsize=b.x.size();
	int nsize=max(asize,bsize);
	ans.x.resize(nsize+10);
	for(int i=0;i<nsize;i++){
		if(asize-1<i+1)a.x.push_back(0);
		if(bsize-1<i+1)b.x.push_back(0);
		if(ans.x.size()-1<i+1)ans.x.push_back(0);
		ans.x[i]+=a.x[i]+b.x[i];
	}
	int i=0;
	while(true){
		if(ans.x.size()-1<i+1){
			if(ans.x[i]==0)break;
			ans.x.push_back(0);
		}
		ans.x[i+1]+=ans.x[i]/10;
		ans.x[i++]%=10;
	}
	while(*ans.x.rbegin()==0)ans.x.pop_back();
	//print(a),printf(" + "),print(b),printf(" = "),print(ans),printf(" \n");
	return ans;
}
inline bool operator<(BigInt a,BigInt b){
	while(a.x.size()>1&&*a.x.rbegin()==0)a.x.pop_back();
	while(b.x.size()>1&&*b.x.rbegin()==0)b.x.pop_back();
	int asize=a.x.size(),bsize=b.x.size();
	if(asize<bsize)return true;
	else if(asize>bsize)return false;
	else{
		for(int i=asize-1;i>=0;i--){
			if(a.x[i]<b.x[i])return true;
			else if(a.x[i]>b.x[i])return false;
		}
	}
	return false;
}
inline BigInt Max(BigInt a,BigInt b){
	//printf("Max("),print(a),printf(","),print(b),printf(")");
	if(a<b){/*print(b),printf("\n");*/return b;}
	/*print(a),printf("\n");*/return a;
}
BigInt f[maxn][maxn],p[maxn],ans;
int n,m,a[maxn][maxn];
inline void work(long long tmp){
	memset(f,0,sizeof(f));
	for(int i=1;i<=m;i++)f[i][i]=p[m]*a[tmp][i];
	for(int l=2;l<=m;l++)for(int i=1;i+l-1<=m;i++){
		int j=i+l-1;
		f[i][j]=Max(f[i+1][j]+(p[m-l+1]*a[tmp][i]),f[i][j-1]+(p[m-l+1]*a[tmp][j]));
	}
	ans=ans+f[1][m];
	return;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%lld",&a[i][j]);
	p[1]=2;
	for(int i=2;i<=m;i++)p[i]=p[i-1]*2;
	for(int i=1;i<=n;i++)work(i);
	while(ans.x.size()>1&&*ans.x.rbegin()==0)ans.x.pop_back();
	print(ans),printf("\n");
	return 0;
}


本蒟蒻没学过高精度,调了一下午了,若犯了低级错误,请大佬指出,玄关。

2024/7/12 16:41
加载中...