50分TLE求助
查看原帖
50分TLE求助
64976
hewo楼主2021/4/24 14:59

后面5个点T了

#include<bits/stdc++.h>
using namespace std;

#define inf 0x7fffffff
#define LL long long
#define lim 1000000
const LL MX=1*1000+10;
const LL ME=1000100;

inline LL read()
{
    LL x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

inline void clear(queue<LL>& q) {
	queue<LL> empty;
	swap(empty, q);
}

LL T;
LL n,m;

struct tedge
{
	LL to,next;
	LL value;
}e[ME];
LL head[ME],cnt=0;

LL a[MX][MX],b[MX][MX];
LL num[MX*3];
bool used[MX*3];
LL dis[MX*3];

queue<LL> qaq;

inline void add(LL a,LL b,LL c)
{
	e[++cnt].to=b,e[cnt].value=c;
	e[cnt].next=head[a];
	head[a]=cnt;
}

inline void limit(LL a,LL b,LL c)
{
	//0<=c+a-b<=1000000
	add(a,b,c),add(b,a,lim-c);
}

inline LL spfa()
{
	dis[1]=0,used[1]=1;
	qaq.push(1);

	while(!qaq.empty())
	{
		LL q=qaq.front();
		qaq.pop();
		num[q]++;
		if(num[q]>n+m) return 0;
		for(LL i=head[q];i;i=e[i].next)
		{
			LL yt=e[i].to,val=e[i].value;
			if(dis[yt]>dis[q]+val)
			{
				dis[yt]=dis[q]+val;
				if(!used[yt])
				{
					used[yt]=1;
					qaq.push(yt);
				}
			}
		}
		used[q]=0;
	}	//printf("OK\n");
	return 1;
}

inline LL calc(LL x,LL y)
{
	return a[x][y]+(((x+y)&1)?(dis[n+y]-dis[x]):(dis[x]-dis[n+y]));
}

inline void csh()
{
	clear(qaq);
	memset(head,0,sizeof(head));
	cnt=0;
	memset(e,0,sizeof(e));
	for(LL i=1;i<=n+m;i++)
	{
		dis[i]=inf,num[i]=0,used[i]=0;
	}
}

int main(int argc, char const *argv[])
{
	freopen("mir.in","r",stdin);
	freopen("mir.out","w",stdout);
	T=read();
	while(T--)
	{
		n=read(),m=read();
		csh();
		for(LL i=1;i<n;i++)
		{
			for(LL j=1;j<m;j++)
			{
				b[i][j]=read();
			}
		}
		for(LL i=2;i<=n;i++)
		{
			for(LL j=2;j<=m;j++)
			{
				a[i][j]=b[i-1][j-1]-a[i-1][j-1]-a[i-1][j]-a[i][j-1];
			}
		}
		for(LL i=1;i<=n;i++)
		{
			for(LL j=1;j<=m;j++)
			{
				if((i+j)%2==1) limit(n+j,i,a[i][j]);
				else limit(i,n+j,a[i][j]);
			}
		}
		if(!spfa())
		{
			printf("NO\n");		
		}
		//printf("ok\n");
		else
		{
			printf("YES\n");
			//for(LL i=1;i<=n+m;i++) printf("%d ",dis[i]);
			//printf("\n");
			for(LL i=1;i<=n;i++)
			{
				for(LL j=1;j<=m;j++)
				{
					printf("%d ",calc(i,j));
					a[i][j]=0;
				}
				printf("\n");
			}
		}
	}
	return 0;
}
2021/4/24 14:59
加载中...