萌新提问:代码厌氧怎么办?
查看原帖
萌新提问:代码厌氧怎么办?
297647
Z_F_C楼主2022/10/6 15:44

RT。
不开O2能AC
开了反而WA
在IDE上测式后发现程序中的循环是一个也没有进,不是很能理解,求大佬解答。
↓↓代码↓↓

#include<bits/stdc++.h>
using namespace std;
const int len_arr=15;
const int MOD=10000;//压四位高精 
struct HACC{
	int f,dig,bit[len_arr];//f-正负号;dig-位数;bit[]-每位
	friend HACC operator + (HACC x,HACC y);
	friend HACC operator - (HACC x,HACC y);
	friend HACC operator * (HACC x,HACC y);
	friend bool operator < (HACC x,HACC y);
	friend bool operator == (HACC x,HACC y);
	
	void clear(){
		f=1;
		dig=1;
		for(int i=1;i<=len_arr;i++)
			bit[i]=0;
	}
	void input(){//快读 
		clear();
		dig--;
		int idig=0,iA[len_arr<<2];
		char ch=getchar();
		while(ch<'0'||ch>'9'){
			if(ch=='-') f=-1;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9'){
			iA[++idig]=ch^48;
			ch=getchar();
		}
		for(int i=1;(i<<1)<=idig;i++){
			int c=iA[i];
			iA[i]=iA[idig-i+1];
			iA[idig-i+1]=c;
		}
		iA[idig+1]=iA[idig+2]=iA[idig+3]=iA[idig+4]=0;
		for(int i=1;i<=idig;i+=4)
			bit[++dig]=iA[i]+iA[i+1]*10+iA[i+2]*100+iA[i+3]*1000;
	}
	void output(){
		if(dig==1&&!bit[1]) f=1;//为0时去掉负号
		if(f==-1) putchar('-');
		for(int i=dig;i>=1;i--){
			if(i==dig) printf("%d",bit[i]);
			else{
				if(bit[i]<=9) putchar('0');
				if(bit[i]<=99) putchar('0');
				if(bit[i]<=999) putchar('0');
				printf("%d",bit[i]);
			}
		}
	}
	friend bool operator < (HACC x,HACC y){//小于 
		if(x.f==y.f){
			if(x.f*x.dig<y.f*y.dig) return true;
			if(x.f*x.dig>y.f*y.dig) return false;
			for(int i=x.dig;i>=1;i--){
				if(x.f*x.bit[i]<y.f*y.bit[i]) return true;
				if(x.f*x.bit[i]>y.f*y.bit[i]) return false;
			}
			return false;//相等 
		}
		else if(x.f==-1) return true;
		return false;
	}
	friend bool operator == (HACC x,HACC y){//等于 
		if(x.f==y.f){
			if(x.f*x.dig!=y.f*y.dig) return false;
			for(int i=x.dig;i>=1;i--)
				if(x.f*x.bit[i]!=y.f*y.bit[i]) return false;
			return true;//相等 
		}
		else return false;
	}
	friend HACC operator + (HACC x,HACC y){//加法 
		HACC res;
		res.clear();
		if(x.f==y.f){
			int crr=0,mdig=max(x.dig,y.dig);//crr-进位 
			res.f=x.f;
			for(int i=1;i<=mdig;i++){
				res.bit[i]=x.bit[i]+y.bit[i]+crr;
				crr=res.bit[i]/MOD;
				res.bit[i]%=MOD;
			}
			if(crr) res.bit[++mdig]=crr;
			res.dig=mdig;
		}
		else{
			if(x.f==-1){
				x.f=1;
				res=y-x;
			}
			else{
				y.f=1;
				res=x-y;
			}
		}
		return res;
	}
	friend HACC operator - (HACC x,HACC y){//减法 
		HACC res;
		res.clear();
		if(x.f==y.f){
			res.f=x.f;
			int bor=0,mdig=max(x.dig,y.dig);
			if(x<y) swap(x,y),res.f*=-1;
			for(int i=1;i<=mdig;i++){
				res.bit[i]=x.bit[i]-bor-y.bit[i];
				bor=0;
				if(res.bit[i]<0){
					bor=1;
					res.bit[i]+=MOD;
				}
			}
			res.dig=mdig;
			while(!res.bit[res.dig]&&res.dig>=2) res.dig--;//去前导0
		}
		else{
			if(x.f==-1){
				y.f=-1;
				res=x+y;
			}
			else{
				y.f=1;
				res=x+y;
			}
		}
		return res;
	}
	friend HACC operator * (HACC x,HACC y){//乘法 
		HACC res;
		res.clear();
		res.f=x.f*y.f;
		int mdig=x.dig+y.dig;
		for(int i=1;i<=x.dig;i++){
			int arr=0;
			for(int j=1;j<=y.dig;j++){
				res.bit[i+j-1]+=x.bit[i]*y.bit[j]+arr;
				arr=res.bit[i+j-1]/MOD;
				res.bit[i+j-1]%=MOD;
			}
			if(arr) res.bit[i+y.dig]=arr;
		}
		res.dig=mdig;
		while(!res.bit[res.dig]&&res.dig>=2) res.dig--;//去前导0
		return res;
	}
};
HACC StoH(int x){//单精度转化为高精度 
	HACC res;
	int idig=0,iA[len_arr<<2];
	res.dig=0;
	res.f=1;
	if(x<0) res.f=-1,x*=-1;
	else if(x==0){
			res.dig=1;
			return res;
		}
	while(x){
		iA[++idig]=x%10;
		x/=10;
	}
	iA[idig+1]=iA[idig+2]=iA[idig+3]=iA[idig+4]=0;
	for(int i=1;i<=idig;i+=4)
		res.bit[++res.dig]=iA[i]+iA[i+1]*10+iA[i+2]*100+iA[i+3]*1000;
	return res;
}
HACC maxn(HACC x,HACC y){//取较大值 
	if(x<y) return y;
	return x;
}
HACC minn(HACC x,HACC y){//取较小值
	if(x<y) return x;
	return y;
}
int n,m;
HACC ans,power2[100],a[100],dp[100][100];

void init()
{
	ans.clear();
	power2[0].f=1;
	power2[0].bit[1]=1;
	power2[0].dig=1;
	for(int i=1;i<=m;i++)
		power2[i]=power2[i-1]*StoH(2);
		
}
void initdp()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)	
			dp[i][j].clear();
	for(int i=1;i<=m;i++)
		dp[i][i]=a[i]*power2[m];
}
int main()
{
	scanf("%d%d",&n,&m);
	init();
	for(int q=1;q<=n;q++)
	{
		for(int j=1;j<=m;j++)
			a[j].input();
		initdp();
		for(int len=2;len<=m;len++)
		{
			for(int i=1;i+len-1<=m;i++)
			{
				int j=i+len-1,t=m-len+1;//t即取得时的次数
				dp[i][j].clear();
				dp[i][j]=maxn(dp[i+1][j]+power2[t]*a[i],dp[i][j-1]+power2[t]*a[j]);
			}
		}
		ans=ans+dp[1][m];
	}
	ans.output();
	return 0;
}

↑↑代码↑↑

2022/10/6 15:44
加载中...