欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DTOI 2018 10.26测试 T1 新的世界

程序员文章站 2022-03-11 12:52:27
...

T1 新的世界(neworld)

时间限制: 1 Sec 内存限制: 256 MB

题目描述

在一个NNMM 列的网格中,第iijj 列的格子有一个可变的“亮度”
Li,jL_{i,j}(初始时都为0)和一个固定的“不透光度”。现在在rrcc 列放入一个亮度为ll的光源,NEWorld游戏引擎会根据以下逻辑,让光源逐步“照亮”附近的方格:

先将光源所在方格的亮度 Lr,c\ L_{r,c}赋值为ll 。而对于iijj 列一个不是光源的方格,它的亮度由 Ai,j\ A_{i,j}和四周方格的亮度所确定。
定义Fi,j=max(Li1,j,Li+1,j,Li,j1,Li+1,j,Li,j+1)Ai,jF_{i,j}=max({L_{i-1,j},L_{i+1,j},L_{i,j-1},L_{i+1,j},L_{i,j+1}})−A_{i,j}(此处当1iN1≤i′≤N
不成立或1jM1≤j′≤M不成立时,LijL_{i′j′}被看作是0),我们称方格(i,j)(i,j) 的亮度Li,jL_{i,j}是“有效”的,当且仅当Li,j=Fi,jL_{i,j}=F_{i,j}。显然初始时所有亮度都是“有效”的,而放入光源后则可能存在亮度“无效”的方格。

现在引擎会循环执行操作,每一步找出当前所有亮度“无效”(不包括光源)的方格中,行数ii最小的那一个(如果有多个行数ii
最小的,就选择其中列数jj最小的方格),然后计算Fi,jF_{i,j} 的值,将其赋值给Li,jL_{i,j}
。操作会不停地执行,直到所有亮度都“有效”为止(请参考样例,循环一定会在有限步操作后结束)。请问最后ppqq列的方格亮度值Lp,qL_{p,q} 是多少?

注:max(a,b,c,d,e)max (a,b,c,d,e)表示取a,b,c,d,ea,b,c,d,e中最大的值。

输入

输入文件第一行两个正整数N,MN,M ,表示网格大小为NNMM 列。

接下来的NN行,每行MM个正整数,其中第iijj 列的正整数为Ai,jA_{i,j}

最后一行包含五个正整数r,c,l,p,qr,c,l,p,q表示在rrcc 列放入亮度为ll 的光源,需要查询的是亮度计算完成后ppqq
列的亮度值。

输出

输出文件包含一行一个正整数,表示最后Lp,qL_{p,q} 的值。

数据范围

对于60%60 \%的数据:N,M100N,M≤100

对于100%100\% 的数据:N,M500,1Ai,j,l109,1r,pN,1c,qMN,M500,1Ai,j,l109,1r,pN,1c,qMN,M≤500,1≤A_{i,j},l≤10^9,1≤r,p≤N,1≤c,q≤M N,M≤500,1≤A_{i,j},l≤10^9,1≤r,p≤N,1≤c,q≤M

题解: 考虑一个点可能会被多次更新,显然不可以直接bfs跑一遍,于是看他有点像最长路的性质,将点权当成类似最短路中的disdis,于是直接跑。考场上是spfaspfadijkstradijkstra都可以过
(ps.本来出题人本不想卡spfaspfa的,但我硬是搞出了一种数据卡spfaspfa 2333)

#include<bits/stdc++.h>
using namespace std;
#define in inline
#define re register
#define rep(i,a,b) for(re int i=a;i<=b;i++)
#define repd(i,a,b) for(re int i=a;i>=b;i--)
#define For(i,a,b) for(re int i=a;i<b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template<class T>in void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
const int N=504;
int a[N][N],c[N][N],n,m,R,C;bool vis[N][N];
typedef pair<int,int>P;
typedef pair<int,P>PP;
priority_queue<PP>q;
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
in void bfs(){
	priority_queue<PP>q;
	q.push(mk(0,mk(R,C)));
	while(!q.empty()){
		PP now=q.top();q.pop();
		P tt=now.se;
		int x=tt.fi,y=tt.se;
		if(vis[x][y]) continue;
		vis[x][y]=1;
		For(i,0,4){
			int tx=x+dx[i],ty=y+dy[i];
			if(tx>n||tx<1||ty>m||ty<1) continue;
			if(c[tx][ty]<c[x][y]-a[tx][ty]){
				c[tx][ty]=c[x][y]-a[tx][ty];
				q.push(mk(c[tx][ty],mk(tx,ty)));
			}
		}
	}
}
int main(){
	freopen("neworld.in","r",stdin),freopen("neworld.out","w",stdout);
	g(n),g(m);
	rep(i,1,n) rep(j,1,m) g(a[i][j]);
	g(R),g(C);g(c[R][C]);
	bfs();
	int ax,ay;g(ax),g(ay);
	/*rep(i,1,n){
		rep(j,1,m) cout<<c[i][j]<<" ";
		cout<<endl;
	}*/
	printf("%d\n",c[ax][ay]);
	return 0;
}

相关标签: 最长路 DIJKSTRA