传送门

分析

就是飞飞侠这道题......

我们可以将这张图建成好几层,每一层可以向下一层的上下左右无代价移动,而对于每个点如果付b[i][j]的代价就可以走到比它高a[i][j]的层上。我们用这种方式优化了建边,然后跑个最短路就行了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define ri register int
const long long inf = 1e12+;
const int dx[] = {,-,,,};
const int dy[] = {,,,-,};
inline int ra(){
int x=;char s=getchar();while(!isdigit(s))s=getchar();
while(isdigit(s)){x=(x<<)+(x<<)+(s-'');s=getchar();}return x;
}
inline long long ra2(){
long long x=;char s=getchar();while(!isdigit(s))s=getchar();
while(isdigit(s)){x=(x<<)+(x<<)+(s-'');s=getchar();}return x;
}
struct node {long long wh;int x,y,z;};
bool operator < (node p,node q){return p.wh>q.wh;}
int n,m,a[][],vis[][][],x[],y[];
priority_queue<node>q;
long long b[][],d[][][],w[];
inline void dij(int s,int t1,int t2){
node A,B;
for(ri i=;i<=n;++i)
for(ri j=;j<=m;++j)
for(ri k=;k<=n+m;++k)d[i][j][k]=inf,vis[i][j][k]=;
while(!q.empty())q.pop();
d[x[s]][y[s]][]=;
A.wh=,A.x=x[s],A.y=y[s],A.z=;
q.push(A);
while(!q.empty()){
if(vis[x[]][y[]][]&&vis[x[]][y[]][]&&vis[x[]][y[]][])
break;
A=q.top();q.pop();
if(vis[A.x][A.y][A.z])continue;
vis[A.x][A.y][A.z]=;
if(A.z>){
for(ri i=;i<;++i){
if(dx[i]+A.x<||dx[i]+A.x>n)continue;
if(dy[i]+A.y<||dy[i]+A.y>m)continue;
if(d[A.x+dx[i]][A.y+dy[i]][A.z-]>A.wh){
d[A.x+dx[i]][A.y+dy[i]][A.z-]=A.wh;
B.x=A.x+dx[i],B.y=A.y+dy[i],B.z=A.z-,B.wh=A.wh;
q.push(B);
}
}
}else {
if(d[A.x][A.y][a[A.x][A.y]]>A.wh+b[A.x][A.y]){
d[A.x][A.y][a[A.x][A.y]]=A.wh+b[A.x][A.y];
B.x=A.x,B.y=A.y,B.z=a[A.x][A.y],B.wh=A.wh+b[A.x][A.y];
q.push(B);
}
}
}
w[t1]+=d[x[t1]][y[t1]][],w[t2]+=d[x[t2]][y[t2]][];
return;
}
int main(){
int out;
n=ra(),m=ra();
for(ri i=;i<=n;++i)
for(ri j=;j<=m;++j)
a[i][j]=ra(),a[i][j]=min(a[i][j],n+m);
for(ri i=;i<=n;++i)
for(ri j=;j<=m;++j)
b[i][j]=ra2();
for(ri i=;i<;++i)x[i]=ra(),y[i]=ra();
long long minn=inf;
dij(,,),dij(,,),dij(,,);
if(w[]<minn)minn=w[],out=;
if(w[]<minn)minn=w[],out=;
if(w[]<minn)minn=w[],out=;
if(minn>=inf)puts("NO");
else cout<<char(out+'X')<<endl<<minn<<endl;
return ;
}

ZROI2018普转提day1t4的更多相关文章

  1. ZROI2018普转提day6t1

    传送门 分析 记录区间最大值,线段树上二分找比这个点大的最靠前位置即可 代码 #include<iostream> #include<cstdio> #include<c ...

  2. ZROI2018普转提day6t3

    传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...

  3. ZROI2018普转提day7t1

    传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...

  4. ZROI2018普转提day7t2

    传送门 分析 首先我们不难想到我们一定可以将每一个点分开算,然后看这个点被几个矩形包含 于是对于位置为$(i,j)$的点它被包含的次数为$i * (n-i+1) * j * (m-j+1)$ 这个式子 ...

  5. ZROI2018普转提day1t1

    传送门 分析 我们先二分一下最终的平均值mid,然后让序列中的每一个数都减去这个mid,之后用新序列的前缀和建一棵线段树,枚举起点i,然后求出此时在i+L-1~i+R-1范围内的前缀和的最大值,用这个 ...

  6. ZROI2018普转提day2t4

    传送门 分析 考场上暴力水过好评... 然后我的st表查询似乎是log的,然后log三方跑的比log方快,qwq. 我们发现如果一个区间的最小值就是这个区间的gcd,则这个区间合法.所以我们二分区间长 ...

  7. ZROI2018普转提day2t2

    传送门 分析 我们发现2R+C实际就相当于R行C列的子集的个数.因此我们可以将所有集合的子集个数转换为每个集合属于的集合的个数.所以我们可以求出: 这个式子的意义为对于选i行j列的情况的所有方案乘上i ...

  8. ZROI2018普转提day2t1

    传送门 分析 我们通过仔细研究不难发现对于一次交换(i,i+1)的操作之后,在i之前的点就不可能跑到i之后,i+1之后的的点也不可能跑到i+1之前,所以这个序列在一次交换之后就相当于被分成了两个部分. ...

  9. ZROI2018普转提day2t3

    传送门 分析 考试的时候sb了......我们发现可以按照先序遍历将一棵树变成一个序列,而不需要删的数的数量便是最长上升子序列的长度,但是还有一个问题就是如果在5和7之间有3个空的位置就无法填入合法的 ...

随机推荐

  1. 2017.12.15 python资料,转存一下。

    最近GD项目三个型号都是用Python做批量烧录和测试的.marking一下,,虽然自己不会写. 1.入门阶段 The Python Tutorial(https://docs.python.org/ ...

  2. 每天一个linux命令(15):head命令

    版权声明更新:2017-05-19博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  3. visualvm-profile以及远程访问

    使用visualvm的Profiler功能,可以提供两方面的性能跟踪功能: Profile 一个是CPU,可以跟踪每个方法占用CPU的时长:比如你在发现CPU持续走高的时候可以通过Profile的CP ...

  4. dockerfile mysql

    FROM centos6.6-mysql5.5:0.0.4 MAINTAINER syberos:wangmo RUN mv /etc/my.cnf /etc/my.cnf.bak ADD my.cn ...

  5. Java基础--注解Annotation

    Annotation是给类,方法或域上加的一种特殊的标记,可以通过反射取到注解的类型和值,从而完成某种特定的操作. 定义注解需要使用元注解,元注解有@Retention和@Target //@Rete ...

  6. 机器学习:SVM(scikit-learn 中的 SVM:LinearSVC)

    一.基础理解 Hard Margin SVM 和 Soft Margin SVM 都是解决线性分类问题,无论是线性可分的问题,还是线性不可分的问题: 和 kNN 算法一样,使用 SVM 算法前,要对数 ...

  7. java代码异常捕获throws抛出异常

    总结:Throwable 是所以异常的父类.error和Exception是继承它的类 Exception: 这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环 ...

  8. String是基本的数据类型吗?

    String不是基本的数据类型,是final修饰的java类,java中的基本类型一共有8个,它们分别为: 1 字符类型:byte,char 2 基本整型:short,int,long 3 浮点型:f ...

  9. [置顶] 制作开机LOGO就是这么简单!

    转自: http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328522&idx=1&sn=64107695fef ...

  10. Python多进程-进程间数据的传递

    两个进程间的数据是独立的,要进行数据传递的话可通过几个方法 Queue 通过队列来进行进程间数据的传递 # -*- coding:utf-8 -*- __author__ = "MuT6 S ...