QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#864974#7737. Extending Distancedyj133446WA 1ms9960kbC++143.0kb2025-01-21 12:42:122025-01-21 12:42:13

Judging History

你现在查看的是最新测评结果

  • [2025-01-21 12:42:13]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:9960kb
  • [2025-01-21 12:42:12]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=1005,inf=1e9;
int t,n,m,k,S,T,r[N][N],c[N][N],h[N],cur[N],cnt,dis[N],R[N][N],C[N][N];
bool vis[N];
struct nn{
	int to,next,s,p;
}e[10*N];
int Get(int x,int y){return (x-1)*(m-1)+y;}
void add(int x,int y,int s,int p)
{
	e[++cnt]=(nn){y,h[x],s,p};h[x]=cnt;
	e[++cnt]=(nn){x,h[y],0,-p};h[y]=cnt;
}
bool spfa()
{
	queue<int>q;
	memset(dis,0x3f,sizeof(dis)),dis[S]=0,q.emplace(S);
	while(!q.empty())
	{
		int x=q.front();q.pop(),vis[x]=0;
		for(int i=h[x];i;i=e[i].next)
		{
			int y=e[i].to;
			if(e[i].s&&dis[x]+e[i].p<dis[y])
			{
				dis[y]=dis[x]+e[i].p;
				if(!vis[y])vis[y]=1,q.emplace(y);
			}
		}
	}
	return dis[T]<inf;
}
int dfs(int x,int val)
{
	if(x==T||!val)return val;
	vis[x]=1;
	int res=0;
	while(int i=cur[x])
	{
		int y=e[i].to;
		if(dis[y]==dis[x]+e[i].p&&!vis[y])
		{
			int val1=min(e[i].s,val-res);
			val1=dfs(y,val1);
			e[i].s-=val1,e[i^1].s+=val1,res+=val1;
			if(res==val)return vis[x]=0,res;
		}
		cur[x]=e[i].next;
	}
	return vis[x]=0,res;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	for(int tt=1;tt<=t;tt++)
	{
		cin>>n>>m>>k,S=(n+1)*(m-1)+1,T=S+1,cnt=1;
		for(int i=1;i<=T;i++)h[i]=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<m;j++)
			{
				cin>>r[i][j];
				add(Get(i,j),Get(i+1,j),r[i][j],0),add(Get(i+1,j),Get(i,j),r[i][j],0);
				add(Get(i,j),Get(i+1,j),inf,1),add(Get(i+1,j),Get(i,j),inf,1);
			}
		}
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>c[i][j];
				if(j==1||j==m)continue;
				add(Get(i,j-1),Get(i,j),c[i][j],0),add(Get(i,j),Get(i,j-1),c[i][j],0);
				add(Get(i,j-1),Get(i,j),inf,1),add(Get(i,j),Get(i,j-1),inf,1);
			}
		}
//		if(tt==52)
//		{
//			cout<<n<<' '<<m<<' '<<k<<'\n';
//			for(int i=1;i<=n;i++)
//			{
//				for(int j=1;j<m;j++)cout<<r[i][j]<<' ';
//				cout<<'\n';
//			}
//			for(int i=1;i<n;i++)
//			{
//				for(int j=1;j<=m;j++)cout<<c[i][j]<<' ';
//				cout<<'\n';
//			}
//			return 0;
//		}
		for(int i=1;i<m;i++)add(S,Get(1,i),inf,0),add(Get(n+1,i),T,inf,0);
		int ans=0,lim=inf;
		bool flag=0;
		while(spfa())
		{
			memcpy(cur,h,sizeof(h));
			if(dis[T]&&!flag)flag=1,lim=k;
			int VAL=dfs(S,lim);if(flag)lim-=VAL,ans+=dis[T]*VAL;
			if(!lim)break;
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<m;j++)
			{
				R[i][j]=r[i][j];
				for(int k=h[Get(i,j)];k;k=e[k].next)
				{
					if(e[k].to==Get(i+1,j)&&e[k].p&&k%2==0)R[i][j]=r[i][j]+inf-e[k].s;
				}
			}
		}
		for(int i=2;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				C[i][j]=c[i][j];
				if(j==1||j==m)continue;
				for(int k=h[Get(i,j)];k;k=e[k].next)
				{
					if(e[k].to==Get(i,j-1)&&e[k].p&&k%2==0)C[i][j]=c[i][j]+inf-e[k].s;
				}
			}
		}
		if(t!=125||tt==52)
		{
			cout<<ans<<'\n';
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<m;j++)cout<<R[i][j]<<' ';
				cout<<'\n';
			}
			for(int i=2;i<=n;i++)
			{
				for(int j=1;j<=m;j++)cout<<C[i][j]<<' ';
				cout<<'\n';
			}	
		}
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 9960kb

input:

2
3 4 6
2 1 15
7 1 9
13 3 2
3 6 1 2
5 2 15 3
3 3 3
1 1
2 2
3 3
1 1 1
2 2 2

output:

9
2 1 15 
8 1 9 
13 3 5 
3 6 6 2 
5 2 15 3 
4
1 4 
2 3 
3 3 
1 1 1 
2 2 2 

result:

ok Correct. (2 test cases)

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 9832kb

input:

125
4 4 48
33 9 39
38 74 3
18 44 9
20 91 19
76 95 17 16
61 88 50 49
68 18 33 84
4 4 14
54 69 42
47 90 28
2 73 59
1 20 90
43 22 74 19
27 67 46 43
42 21 78 80
4 4 93
12 67 38
13 85 39
74 68 77
71 80 64
92 97 53 46
66 6 30 20
66 70 71 24
4 4 34
43 86 55
49 34 73
78 77 90
99 49 5
55 4 63 47
80 24 15 3
8...

output:

30
49 10 49 
18 80 98 
29 24 55 
6 25 77 
57 55 84 54 
21 82 85 88 
57 16 29 58 

result:

wrong answer Integer 18 violates the range [38, 2*10^9] (test case 1)