为什么会 TLE on #49
查看原帖
为什么会 TLE on #49
239988
TianLuen楼主2023/10/24 19:05

是最后一个数据点。

复杂度应该没假,同样规模的数据点跑得飞快,唯独这一个点完全超时。

#include<bits/stdc++.h>
using namespace std;
struct Case
{
	using ll=long long;
	static const int MAXN=210;
	
	ll a[MAXN][MAXN];
	int n,m;
	
	unordered_map<ll,ll>mp[MAXN][2];
	
	void ipt()
	{
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				scanf("%lld",&a[i][j]);		
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				a[i][j]-=i+j;
	}
	
	void chkmin(ll&x,ll y)
	{
		x=min(x,y);
	}
	
	void next(int x,int y,int k)
	{
		for(auto i=mp[x][k].begin();i!=mp[x][k].end();i++)
		{
			if(y+1<m)
			{
				if(mp[x][k^1].count(min(a[x][y+1],i->first)))
					chkmin(mp[x][k^1][min(a[x][y+1],i->first)],i->second+a[x][y+1]);
				else
					mp[x][k^1][min(a[x][y+1],i->first)]=i->second+a[x][y+1];
			}
			if(x+1<n)
			{
				if(mp[x+1][k^1].count(min(a[x+1][y],i->first)))
					chkmin(mp[x+1][k^1][min(a[x+1][y],i->first)],i->second+a[x+1][y]);
				else
					mp[x+1][k^1][min(a[x+1][y],i->first)]=i->second+a[x+1][y];
			}
		}
		mp[x][k].clear();
	}
	
	void clear(int k)
	{
		for(int i=0;i<=n;i++)
			mp[i][k].clear();
	}
	
	void calc()
	{
		mp[0][0][a[0][0]]=a[0][0];
		for(int ij=0;ij<n+m-2;ij++)
			for(int i=max(0,ij-m+1);i<=min(ij,n-1);i++)
				next(i,ij-i,ij&1);
		ll ans=LONG_LONG_MAX;
		for(auto i=mp[n-1][(n+m)&1].begin();i!=mp[n-1][(n+m)&1].end();i++)
		{
			chkmin(ans,i->second-i->first*(n+m-1));
		}
		clear((n+m)&1);
		printf("%lld\n",ans);
	}
	
	void solve()
	{
		ipt();
		calc();
	}
}T;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
		T.solve();
}
2023/10/24 19:05
加载中...