NC235745 拆路
题目
题目描述
有 \(n\) 个城镇,城镇之间有 \(m\) 条道路相连,道路可以看成无向边。每一个城镇都有自己的一个繁荣度 \(v_i\) ,一个城镇 \(u\) 受到的影响 \(p\) 是与\(u\) 直接或者间接相连的所有城镇中,繁荣度的最大值。一个城镇 \(u\) 与城镇 \(v\) 是被视为直接或者间接相连的,当且仅当 \(u=v\) 或者从 \(u\) 出发,可以沿着某些道路到达 \(v\) 。为了减少维护成本,现准备拆除其中的某一些路。具体来说,你需要维护以下两种操作:
- 'Q' \(a\),询问 \(a\) 城镇受到的影响 \(p\) ;
- 'D' \(a\ b\) ,删除 \(a\ b\) 之间的道路。
输入描述
第一行输入两个整数 \(n,m(1\le n,m \le 10^5)\) ,分别表示城镇的数量和道路的数量。第二行输入 \(n\) 个整数 \(v_1,v_2,...,v_n(1\le v_i \le 10^9)\) ,分别表示每一个城镇的繁荣度。接下来 \(m\) 行,每行两个整数 \(u,v(1\le u,v \le n)\) ,表示城镇 \(u,v\) 之间有一条道路连接。保证不含有重边、自环。
接下来一行,输入一个整数 \(Q(1\le Q \le 10^5)\) ,表示操作的个数。
接下来 \(Q\) 行,每行描述一个操作,以'Q' \(a(1\le a \le n)\) 或者'D' \(a\ b(1\le a,b \le n)\) 的形式给出。对于删除操作,保证被删除的道路是存在的。
输出描述
对于每一个操作1,你都需要输出一个整数 \(p\) ,表示城镇 \(a\) 受到的影响。
示例1
输入
4 3
1 2 3 4
1 2
2 3
3 4
4
Q 1
D 2 3
Q 1
Q 3
输出
4
2
4
题解
知识点:并查集,离线。
普通并查集不支持撤销操作,这使得这道题难以解答,但转换一下思路,撤销的逆过程是新增,是并查集适用的操作,于是可以保存所有访问数据,离线逆向处理,再将答案保存最后输出即可。
时间复杂度 \(O((m \log n + q)\log q + n)\)
空间复杂度 \(O(q+n+m)\)
代码
#include <bits/stdc++.h>
using namespace std;
int w[100007];
int u[100007], v[100007];
int du[100007], dv[100007];
set<pair<int, int>> s;
int fa[100007];
int ans[100007];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
int rx = find(x);
int ry = find(y);
if (w[rx] < w[ry]) fa[rx] = ry;
else fa[ry] = rx;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1;i <= n;i++) fa[i] = i;
for (int i = 1;i <= n;i++) cin >> w[i];
for (int i = 1;i <= m;i++) cin >> u[i] >> v[i];
int q;
cin >> q;
for (int i = 1;i <= q;i++) {
char op;
cin >> op;
if (op == 'Q') cin >> du[i];
else if (op == 'D') {
cin >> du[i] >> dv[i];
s.insert({ du[i],dv[i] });
s.insert({ dv[i],du[i] });
}
}
for (int i = 1;i <= m;i++)
if (s.find({ u[i],v[i] }) == s.end())
merge(u[i], v[i]);
for (int i = q;i >= 1;i--) {
if (dv[i]) merge(du[i], dv[i]);
else ans[i] = w[find(du[i])];
}
for (int i = 1;i <= q;i++) {
if (ans[i]) cout << ans[i] << '\n';
}
return 0;
}
NC235745 拆路的更多相关文章
- 【题解】逐个击破 luogu2700
题目 题目描述: 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的. 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少 ...
- HDU 6201 transaction transaction transaction(拆点最长路)
transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/1 ...
- BZOJ.2834.回家的路(最短路Dijkstra 拆点)
题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...
- [Java开发之路](23)装箱与拆箱
1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...
- [转载]Web前端开发工程师编程能力飞升之路
[背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...
- 【转】Web前端研发工程师编程能力飞升之路
分类: Javascript | 出自 海玉的博客 今天看到这篇文章.写的非常有意思.发现自己还有很长的一段路要走. [背景] 如果你是刚进入WEB前端研发领域,想试试这潭水有多深,看这篇文章吧: 如 ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- 微博MySQL优化之路--dockone微信群分享
微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...
- Web前端研发工程师编程能力飞升之路
今天看到这篇文章.写的非常有意思,于是转载了.看看我们都处于什么的阶段. [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着 ...
- BZOJ-1877 晨跑 最小费用最大流+拆点
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
随机推荐
- 为R Markdown配置TinyTex编译环境
技术背景 在前面一篇博客中,我们介绍了一些关于在Windows系统上安装R Studio来编写R Markdown,最后编译成Beamer的演示文档的过程.而在Windows系统的使用过程中发现,编译 ...
- P5704 【深基2.例6】字母转换
1.题目介绍 2.题解 2.1 ASCII码表 在ASCII码表中,小写字母=大写字母+32,则大写字母=小写字母-32 #include<iostream> using namespac ...
- 海思Hi35xx 通过uboot查看flash指定地址的数据
前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...
- [转帖]mysql 里 CST 时区的坑
mysql 里 CST 时区的坑 一.问题简述 mysql 里 CST 时区是个非常坑的概念,因为在 mysql 里CST既表示中国也表示美国的时区.但是在Jdk代码里,CST 这个字符串被理解为Ce ...
- [转帖]Nginx中absolute_redirect、port_in_redirect配置简述
一.背景: 我们在访问nginx代理下的项目前端页面时,经常会有访问链接最末尾带不带'/'的问题,当我们访问http://xxxx/home时,如果匹配不到location,会自动加上端口port以及 ...
- K8S增加限制后的启动时间验证
K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...
- 《Javascript高级程序设计》读书笔记——构造函数与原型
构造函数与原型 构造函数模式 最简单的构造函数: function Person(name, age, job) { this.name = name; this.age = age; this.jo ...
- Ubuntu编译Xilinx的u-boot
博主这里的是Ubuntu20.04LTS+Vivado2017.4+ZedBoard 注意:本文使用的环境变量导入方法是临时的,只要退出当前终端或者使用其他终端就会失效,出现异常问题,请随时expor ...
- 小白学k8s(12)-k8s中PV和PVC理解
pv和pvc 什么是pv和PVC 生命周期 PV创建的流程 1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach 2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount 3.绑定 持久化卷声 ...
- 若依、vue三级路由缓存失败
router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { // 三级菜单组件无法缓存问题 if (t ...