BZOJ 2143

新技能:并查集优化最短路。

暴力最短路是$O(n^4)$的,然后拿个线段树优化一下连边就$O($能过$)$了。

但是这样都太慢了。

我们考虑一个点如果之前被更新过了,那么之后就不会被更新了,所以我们只要能跳过这个已经被更新过的点,直接去更新没有更新过的点就行了,刚好对应了一个并查集的路径压缩,这样子每一次跳到一个没有更新过的点就是$O(1)$的了。

每一个点拿出来的更新的时候其实是要付出它的点权,所以我们要把$dis_{x, y}  + a_{x, y}$一起丢到堆里去才能保证转移的正确性。

还是不会算时间复杂度,但是非常优秀。

Code:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll; const int N = ;
const ll inf = 0x3f3f3f3f3f3f3f3f; int n, m, b[N][N], ufs[N][N], sx[], sy[];
ll a[N][N], dis[N][N], ans[];
bool vis[N][N]; struct Node {
int x, y;
ll d; inline Node (int nowX = , int nowY = , ll nowD = 0LL) {
x = nowX, y = nowY, d = nowD;
} friend bool operator < (const Node &u, const Node &v) {
return u.d > v.d;
} };
priority_queue <Node> Q; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline int min(int x, int y) {
return x > y ? y : x;
} inline int abs(int x) {
return x > ? x : -x;
} int find(int x, int y) {
return ufs[x][y] == y ? y : ufs[x][y] = find(x, ufs[x][y]);
} void dij(int st) {
for(int i = ; i <= n; i++)
for(int j = ; j <= m + ; j++) {
dis[i][j] = inf;
ufs[i][j] = j;
vis[i][j] = ;
}
dis[sx[st]][sy[st]] = 0LL;
Q.push(Node(sx[st], sy[st], a[sx[st]][sy[st]]));
ufs[sx[st]][sy[st]] = sy[st] + ;
for(; !Q.empty(); ) {
Node out = Q.top(); Q.pop();
int x = out.x, y = out.y;
if(vis[x][y]) continue;
vis[x][y] = ; int ln = max(, x - b[x][y]), rn = min(n, x + b[x][y]);
for(int i = ln; i <= rn; i++) {
int stp = b[x][y] - abs(i - x);
int lm = max(, y - stp), rm = min(m, y + stp);
for(int j = find(i, lm); j <= rm; j = find(i, j)) {
if(dis[i][j] > dis[x][y] + a[x][y]) {
dis[i][j] = dis[x][y] + a[x][y];
Q.push(Node(i, j, dis[i][j] + a[i][j]));
}
ufs[i][j] = j + ;
}
}
}
} int main() {
freopen("4.in", "r", stdin);
// freopen("my.out", "w", stdout); read(n), read(m);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
read(b[i][j]);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
read(a[i][j]); for(int i = ; i <= ; i++)
read(sx[i]), read(sy[i]); for(int i = ; i <= ; i++) {
dij(i);
for(int j = ; j <= ; j++) ans[j] += dis[sx[j]][sy[j]];
} ll res = inf, pos = ;
for(int i = ; i <= ; i++)
if(ans[i] < res) res = ans[i], pos = i; if(res >= inf) {
puts("NO");
return ;
} if(pos == ) puts("X");
if(pos == ) puts("Y");
if(pos == ) puts("Z"); printf("%lld\n", res);
return ;
}

Luogu 4473 [国家集训队]飞飞侠的更多相关文章

  1. luogu4473 BZOJ2143 2011[国家集训队]飞飞侠

    题目戳这里 有问题可以在博客@ 应该还会有人来看吧,嘻嘻 正题: 题目大意: 题目很清楚,就是一个点有一定的范围,会有一定的花费 求三个点中的任意两个点到另一个点的最小花费 (麻麻教育我千万读好题目( ...

  2. luogu P2757 [国家集训队]等差子序列

    题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...

  3. luogu P2619 [国家集训队2]Tree I

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

  4. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  5. Luogu P1297 [国家集训队]单选错位

    P1297 [国家集训队]单选错位 题目背景 原 <网线切割>请前往P1577 题目描述 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案.试卷上 ...

  6. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  7. 【luogu P1494 [国家集训队]小Z的袜子】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> ...

  8. 【luogu P1903 [国家集训队]数颜色】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1903 裸的...带修莫队... 比较麻烦吧(对我来说是的) 两个变量分开记录查询和修改操作. #includ ...

  9. BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)

    题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...

随机推荐

  1. Linq:从XML获取数据

    实体类 public class Customer { public string CustomerID { get; set; } public string CompanyName { get; ...

  2. XMemcached使用经历

    XMemcached就是Memcached的java客户端之一,目前项目里用到了.据说它比起其他的java客户端从性能上要好一点,实现方式是NIO的.先看怎么实例化出来一个Memcached客户端吧: ...

  3. dubbox消费者启动成功,却无法连接注册中心

    使用dubbox作为服务提供端很好实现,因为git的说明和网上有很多的例子可供参考,但是消费端都一笔带过,简单得很,初学者往往以为只要配置如下3样东西就够了: <?xml version=&qu ...

  4. javascript中原型学习

    学习地址:http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B/

  5. 【转】使用Jmeter对Websocket进行压力测试

    前段时间本着练习angularJS+requireJS的目的写了一个基于nodeJS和socket.io的聊天室,github地址为:https://github.com/towersxu/node- ...

  6. 【转】Jmeter笔记:响应断言详解

    平时我们使用jmeter进行性能测试时,经常会用到断言.jmeter提供了很多种断言,本来想全都写一下,但发现每一个断言里面的东西都很多,所以就先写一下我们经常使用的响应断言. 第一次在cnblog上 ...

  7. java图形用户界面添加图片的代码

    package com.aa; import java.awt.Component; import javax.swing.ImageIcon; import javax.swing.JPanel; ...

  8. 1111 Online Map

    题意:给定一个图,以及起点和终点,需要我们计算两条路径.第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条:第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条. 思路:两次Dijk ...

  9. mysql 常见参数

    my.cnf[client] 对mysql的所有客端都生效的[mysql] 只对mysql这个命令有效了[mysqd][mysqld_multi] 多实例启动[mysqld_safe][mysqldN ...

  10. Unity3D Demo

    之前在Unity讨论Q群里总是有不少同学求项目资源和源码神马的,其实这种资源在官网很多,而且都比较规范和专业,很有参考价值,链接:https://www.assetstore.unity3d.com/ ...