同一份代码,当我开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;
}
本蒟蒻没学过高精度,调了一下午了,若犯了低级错误,请大佬指出,玄关。