AT4811 [ABC160D] Line++ 题解
Content
给定一个 \(n\) 个点、\(n\) 条边的无向图。对于所有的 \(1\leqslant i<n\),在点 \(i,i+1\) 之间连一条无向边。另外在给定两个点 \(x,y\),在点 \(x,y\) 之间连一条无向边。现请对于所有的 \(1\leqslant k<n\),求出图中最短距离为 \(k\) 的点对数。
数据范围:\(3\leqslant n\leqslant2\times 10^3\),\(1\leqslant x,y\leqslant n\),\(x+1<y\)。
Solution
相信各位一开始想到的就是最短路算法了吧。但是 \(\mathcal O(n^3)\) 的 Floyd 算法并不能跑得过去,那么自然就去想别的最短路算法了,比如 Dijkstra。这时我们发现,\(\mathcal O(n\log n)\) 的堆优化 Dijkstra 貌似可以较轻松地通过此题,那我们不妨来继续往下想一下!
首先我们对于每个点用堆优化 Dijkstra 求出其到每个点的距离,然后再将每个距离存储到桶中。枚举每个点是 \(\mathcal O(n)\) 的,每次跑堆优化 Dijkstra 是 \(\mathcal O(n\log n)\) 的,因此总的时间复杂度是 \(\mathcal O(n^2\log n)\) 的,足以通过此题。
注意,这么样来的话,我们距离为 \(k\) 的点对 \((x,y)\) 就会重复算 \(2\) 次(一次在从点 \(x\) 跑 Dijkstra 的时候,另一次在从点 \(y\) 跑 Dijkstra 的时候)。因此我们最后要将每个得出来的距离为 \(k\) 的点对数除以 \(2\),才能得到正确结果。
Code
const int N = 2e3 + 7;
int n, cnt, num[N], h[N << 1], dis[N], vis[N];
struct edge {int to, nxt;}e[N << 1];
iv a_e(int u, int v) {e[++cnt] = (edge){v, h[u]}; h[u] = cnt;}
iv dj(int s) {
pq<pii> q;
dis[s] = 0, q.push(pii(0, s));
while(!q.empty()) {
int x = q.top().se; q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i = h[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(dis[y] > dis[x] + 1) dis[y] = dis[x] + 1, q.push(pii(-dis[y], y));
}
}
}
int main() {
n = Rint;
F(int, i, 1, n - 1) a_e(i, i + 1), a_e(i + 1, i);
int x = Rint, y = Rint; a_e(x, y), a_e(y, x);
F(int, i, 1, n) {
memset(dis, 0x3f, sizeof(dis)), memset(vis, 0, sizeof(vis));
dj(i);
F(int, j, 1, n) num[dis[j]]++;
}
F(int, i, 1, n - 1) num[i] /= 2, println(num[i]);
return 0;
}
AT4811 [ABC160D] Line++ 题解的更多相关文章
- [LeetCode] Max Points on a Line 题解
题意 Given n points on a 2D plane, find the maximum number of points that lie on the same straight lin ...
- 洛谷:P2952 [USACO09OPEN]牛线Cow Line:题解
题目链接:https://www.luogu.org/problemnew/show/P2952 分析: 这道题非常适合练习deque双端队列,~~既然是是练习的板子题了,建议大家还是练练deque, ...
- UVA12657 Boxes in a Line:题解
题目链接:https://www.luogu.org/problemnew/show/UVA12657 分析: 此题使用手写链表+模拟即可.(其实可以用list,而且更简便,但是会大大的超时) 肯定是 ...
- Max Points on a Line leetcode java
题目: Given n points on a 2D plane, find the maximum number of points that lie on the same straight li ...
- 【leetcode刷题笔记】Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- 2016百度之星 初赛2A ABEF
只做了1001 1002 1005 1006.剩下2题可能以后补? http://acm.hdu.edu.cn/search.php?field=problem&key=2016%22%B0% ...
- [HDU] 3711 Binary Number [位运算]
Binary Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- Airport Express UVA - 11374
In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more q ...
随机推荐
- 彻底搞清楚 JavaScript 的原型和原型链
JavaScript真的挺无语的,怪不得看了那么多的介绍文章还是一头雾水,直到自己终于弄懂了一点点之后才深有体会: 先从整体说起吧,发现没有基础做依据,那都是空中楼阁: 先从基础开始介绍吧,又发现基础 ...
- AGC050B Three Coins
做的时候有思考到是否能转化成移动点问题,但是没有清晰的把他解释出来. NOIP的时候也一样,T3也有考虑到是否能转为差分,但是也没有清晰的写出来. 自己做题的时候应尽量保证草稿纸和思绪的清晰,而不是在 ...
- Git 使用,本地项目上传到GitHub远程库
Git 使用,本地项目上传到GitHub远程库 环境 GitHub账号 点此进入github官网 git客户端工具 点此进入git下载页 本地项目上传到 GitHub 在GitHub中创建一个仓库(远 ...
- 生物信息Linux用户创建与配额设置
创建一个新用户,并配置使用. create_usr.sh: #/usr/bin/bash user=$1 password="123" useradd ${user} -g met ...
- rkhunter使用
1.下载地址:http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/ 2.上传至Linux后解压 3.编译安装 [root@t ...
- adblock plus-看下图你就懂
- 同一局域网,远程连接别人的Mysql数据库
数据库:MySQL 工具: Navicat, 电脑A连接电脑B的数据库, 确保两部电脑都是在同一个局域网,都是连着同一个路由器,或者连接同一个WiFi, 如果不确定是否为同一个局域网,可以打开cmd, ...
- 简述安霸pipeline及其关键参数--raw域模块
何为pipeline: sensor输出是一种叫Bayer 格式的RAW数据图像.ISP 对RAW数据图像的处理流程就是我们说的ISP PipeLine.通过PipeLine的处理,我们可以从一副RA ...
- LVM磁盘创建与扩容
以虚拟机为例 1.在虚拟机上添加新磁盘,点击虚拟机→设置->添加,最后如下图. 2.进入系统fdisk -l,查看当前磁盘信息 [root@master shell]# fdisk -l Dis ...
- deque、queue和stack深度探索(上)
deque是可双端扩展的双端队列,蓝色部分就是它的迭代器类,拥有四个指针,第一个cur用来指向当前元素,first指向当前buffer头部,last指向当前buffer尾部,node指向map自己当前 ...