DTOI 2018 10.26测试 T1 新的世界
程序员文章站
2022-03-11 12:52:27
...
T1 新的世界(neworld)
时间限制: 1 Sec 内存限制: 256 MB
题目描述
在一个行 列的网格中,第 行 列的格子有一个可变的“亮度”
(初始时都为0)和一个固定的“不透光度”。现在在 行 列放入一个亮度为的光源,NEWorld游戏引擎会根据以下逻辑,让光源逐步“照亮”附近的方格:先将光源所在方格的亮度赋值为 。而对于行 列一个不是光源的方格,它的亮度由和四周方格的亮度所确定。
定义(此处当
不成立或不成立时,被看作是0),我们称方格 的亮度是“有效”的,当且仅当。显然初始时所有亮度都是“有效”的,而放入光源后则可能存在亮度“无效”的方格。现在引擎会循环执行操作,每一步找出当前所有亮度“无效”(不包括光源)的方格中,行数最小的那一个(如果有多个行数
最小的,就选择其中列数最小的方格),然后计算 的值,将其赋值给
。操作会不停地执行,直到所有亮度都“有效”为止(请参考样例,循环一定会在有限步操作后结束)。请问最后行列的方格亮度值 是多少?注:表示取中最大的值。
输入
输入文件第一行两个正整数 ,表示网格大小为 行 列。
接下来的行,每行个正整数,其中第 行 列的正整数为
最后一行包含五个正整数表示在 行 列放入亮度为 的光源,需要查询的是亮度计算完成后 行
列的亮度值。输出
输出文件包含一行一个正整数,表示最后 的值。
数据范围
对于的数据:。
对于 的数据:
题解: 考虑一个点可能会被多次更新,显然不可以直接bfs跑一遍,于是看他有点像最长路的性质,将点权当成类似最短路中的,于是直接跑。考场上是和都可以过
(ps.本来出题人本不想卡的,但我硬是搞出了一种数据卡 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;
}