QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#864975 | #7737. Extending Distance | dyj133446 | WA | 1ms | 9956kb | C++14 | 3.1kb | 2025-01-21 12:43:42 | 2025-01-21 12:43:43 |
Judging History
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)),memset(vis,0,sizeof(vis)),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=0;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));
memset(vis,0,sizeof(vis));
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: 9956kb
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: 9796kb
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)