60分,其他WA,求调
查看原帖
60分,其他WA,求调
539726
Xeffry楼主2023/8/31 20:56

因为听说比赛不能用int128,所以手写

#include <bits/stdc++.h>
using namespace std;
long long num=1e18;
struct int128{
	long long hig,low;
};
int128 jia(int128 a,int128 b){
	int128 c;
	c.hig=c.low=0;
	c.low=a.low+b.low;
	c.hig=a.hig+b.hig+c.low/num;
	c.low%=num;
	return c;
}
int128 jian(int128 a,int128 b){
	a.low-=b.low;
	if(a.low<0){
		a.low+num;
		a.hig--;
	}
	a.hig-=b.hig;
	return a;
}
int128 chen(int128 a,int128 b){
	int128 c;
	c.hig=c.low=0;
	c.low=a.low*b.low;
	c.hig=((a.hig*b.low+c.low/num)%num+(b.hig*a.low))%num;
	c.low%=num;
	return c;
}
int128 max128(int128 a,int128 b){
	if(a.hig==b.hig)
		return (a.low>b.low)?a:b;
	return (a.hig>b.hig)?a:b;
}
int mp[81][81];
int tall,weit;
int128 sum,two[81];
void dpo(int x){
	int128 dp[82][82];
	for(int i=0;i<=weit+1;i++){
		for(int j=0;j<=weit;j++){
			dp[i][j].hig=dp[i][j].low=0;
		}
	}
	int ci=0;
	for(int len=weit-2;len>=0;len--){
		ci++;
		for(int i=1;i+len<=weit;i++){
			int128 a,b;
			a.hig=b.hig=0;
			a.low=mp[x][i-1];
			b.low=mp[x][i+len+1];
			a=chen(a,two[ci]);
			b=chen(b,two[ci]);
			a=jia(a,dp[i-1][i+len]);
			b=jia(b,dp[i][i+len+1]);
			dp[i][i+len]=max128(a,b);
			//cout<<i<<"  "<<i+len<<"  "<<dp[i][i+len].low<<endl;
		}
		
	}
	for(int i=1;i<=weit;i++){
		int128 a;
		a.hig=0;
		a.low=mp[x][i];//cout<<a.low<<endl; 
		a=chen(a,two[weit]);
		dp[i][i]=jia(dp[i][i],a);
		
	}
	for(int i=2;i<=weit;i++){
		dp[i][i]=max128(dp[i][i],dp[i-1][i-1]);
	}
	sum=jia(sum,dp[weit][weit]); 
	//cout<<dp[weit][weit].hig<<"   "<<dp[weit][weit].low<<endl;
}
int main(){
	cin>>tall>>weit;
	two[0].hig=two[1].hig=0;
	two[0].low=1;
	two[1].low=2;
	for(int i=2;i<=weit;i++){
		two[i]=chen(two[i-1],two[1]);
	}
	
	for(int i=1;i<=tall;i++){
		for(int j=1;j<=weit;j++){
			cin>>mp[i][j];
		} 
	}
	for(int i=1;i<=tall;i++){
		dpo(i);
	}
	if(sum.hig>0){
		cout<<sum.hig;
	}
	cout<<sum.low;
	return 0;
}

2023/8/31 20:56
加载中...