uoj problem 14 DZY Loves Graph
题目:
DZY开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况:
- Add a b: 表示在 \(a\) 与 \(b\) 之间连了一条长度为 \(i\) 的边(注意,\(i\)是操作编号)。保证 \(1 \leq a, b \leq n\)。
- Delete k: 表示删除了当前图中边权最大的k条边。保证 \(k\) 一定不会比当前图中边的条数多。
- Return: 表示撤销第 \(i-1\) 次操作。保证第 \(1\) 次操作不是 Return 且第 \(i-1\) 次不是 Return 操作。
请你在每次操作后告诉DZY当前图的最小生成树边权和。如果最小生成树不存在则输出 \(0\)。
题解:
首先我们来挖掘一下题目的性质.
- 加入的边权值递增
- 如果一条边被删除,那么所有大于这条边权值的边要么没被加入,要么已经被删除.
所以我们可以直接大力可持久化并查集.
\(O(mlog^2n)\) 做一些有理有据的底层优化应该能过掉.
但其实这道题没有那么复杂.
首先我们先忽略掉Return操作.
我们考虑维护动态加入和删除的并查集.
我们可以直接在\(O(mlogn)\)内完成.
但其实加上Return操作后对我们的做法也没有什么影响.
进行每一次操作的时候,我们首先检查一下下一操作是不是Return操作
如果不是Return我们就直接在现有的状态上进行修改.
如果是Return那么我们就计算出当前操作的影响,并不把这份影响加入到我们当前的状态中.
这样我们就可以直接用一维数组解决掉啦..
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch > '!');if(flag) x=-x;
}
const int maxn = 510010;
int fa[maxn],siz[maxn];
inline int find(int x){
while(fa[x] != x) x = fa[x];
return x;
}
int ope[maxn];
char s[12];
struct ope{
int op,u,v;
}op[maxn];
ll ans[maxn],sum[maxn];
int main(){
int n,m;read(n);read(m);
for(int i=1;i<=n;++i) fa[i] = i,siz[i] = 1;
for(int i=1;i<=m;++i){
scanf("%s",s);
if(*s == 'A'){
op[i].op = 1;
read(op[i].u);
read(op[i].v);
}else if(*s == 'D'){
op[i].op = 2;
read(op[i].u);
}else if(*s == 'R') op[i].op = 3;
}
int ecnt = 0,nodecnt = n;
for(int i=1;i<=m;++i){
if(op[i].op == 1){
if(op[i+1].op == 3){
if(nodecnt == 1) printf("%lld\n",ans[ecnt]);
else if(nodecnt == 2){
int x = find(op[i].u);
int y = find(op[i].v);
if(x == y) puts("0");
else printf("%lld\n",sum[ecnt] + i);
}else puts("0");
printf("%lld\n",ans[ecnt]);
++ i;
}else{
ans[ecnt+1] = ans[ecnt];
sum[ecnt+1] = sum[ecnt];
++ecnt;
int x = find(op[i].u);
int y = find(op[i].v);
if(x == y){
printf("%lld\n",ans[ecnt]);
ope[ecnt] = 0;
continue;
}
if(siz[x] > siz[y]) swap(x,y);
fa[x] = y;siz[y] += siz[x];ope[ecnt] = x;
sum[ecnt] += i;
if(--nodecnt == 1) ans[ecnt] = sum[ecnt];
printf("%lld\n",ans[ecnt]);
}
}else if(op[i].op == 2){
if(op[i+1].op == 3){
printf("%lld\n",ans[ecnt-op[i].u]);
++ i;
printf("%lld\n",ans[ecnt]);
}else{
for(int j=0;j<op[i].u;++j){
if(ope[ecnt] != 0){
int x = ope[ecnt];
++ nodecnt;
siz[fa[x]] -= siz[x];
fa[x] = x;
}-- ecnt;
}
printf("%lld\n",ans[ecnt]);
}
}
}
return 0;
}
uoj problem 14 DZY Loves Graph的更多相关文章
- 学长小清新题表之UOJ 14.DZY Loves Graph
学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...
- 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph
[UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...
- 【UOJ #14】【UER #1】DZY Loves Graph
http://uoj.ac/problem/14 题解很好的~ 不带路径压缩的并查集能保留树的原本形态. 按秩合并并查集可以不用路径压缩,但是因为此题要删除,如果把深度当为秩的话不好更新秩的值,所以把 ...
- uoj #14.【UER #1】DZY Loves Graph
http://uoj.ac/problem/14 由于加入的边权递增,可以直接运行kruskal并支持撤销,但这样如果反复批量删边和撤销,时间复杂度会退化,因此需要对删边操作加上延时处理,只有在删边后 ...
- Codeforces Round #FF (Div. 2):Problem A - DZY Loves Hash
A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)
传送门 题意简述: 要求支持以下操作: 在a与b之间连一条长度为i的边(i是操作编号):删除当前图中边权最大的k条边:表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作. 要求在每次操作后 ...
- UOJ14 DZY Loves Graph
DZY开始有 nn 个点,现在他对这 nn 个点进行了 mm 次操作,对于第 ii 个操作(从 11 开始编号)有可能的三种情况: Add a b: 表示在 aa 与 bb 之间连了一条长度为 ii ...
- [UER #1] DZY Loves Graph
题目描述 开始有 \(n\) 个点,现在对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况: \(Add\) a b: 表示在 \ ...
- 【UER #1】DZY Loves Graph
UOJ小清新题表 题目内容 UOJ链接 DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况: Add a b: ...
随机推荐
- memcache 的使用
基础知识 memcached 是一个开源项目,旨在利用多个服务器内的多余 RAM 来充当一个可存放经常被访问信息的内存缓存.这里的关键是使用了术语缓存:memcached 为加载自他处的信息提供的是内 ...
- pthon 基础 9.8 增加数据
#/usr/bin/python #-*- coding:utf-8 -*- #@Time :2017/11/24 2:59 #@Auther :liuzhenchuan #@File :增加 ...
- EasyNVR无插件直播服务器播放页面的集成----单独的播放器样式
背景需求: EasyNVR自身拥有独立的客户端体系,安卓和IOS拥有各自独立的APP, 安卓下载地址:https://fir.im/EasyNVR: IOS下载可直接在APPstore搜索EasyNV ...
- Redis1 介绍和字典
Redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(列表).set(集合).zset(sor ...
- PAT 1059. C语言竞赛(20)
C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛.既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……). 1. 排名为素数的学生 ...
- centos安装 Falcon+
1:环境 准备 : 安装 go环境 :下载 - Golang中国 参照 :http://www.cnblogs.com/Amos-Turing/p/8494250.html 安装 mysql 安装 r ...
- 【C语言】Linux C调用系统命令
最近研究深度学习,做视频分析和检测,用到C语言,以前都是写python的,不过没关系,计算机语言都是相通的,差不多原理是一样的,只是语法不太一样. 下面介绍linux C语言种调用本地命令,访问一个地 ...
- linux shell 中数组使用方法介绍
linux shell在编程方面比windows 批处理强大太多,不管是在循环.运算.已经数据类型方面都是不能比較的. 以下是个人在使用时候,对它在数组方面一些操作进行的总结. 1.数组定义 [che ...
- ubuntu 16.04 jenkins pipline的实现 最终docker启动服务
准备工作:两台虚拟机A:192.168.1.60 B:192.168.1.61 C:一个存放代码的代码库(github)A:jenkins git docker openssh-server(ssh) ...
- 【DP】最长不下降子序列问题(二分)
Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]= ...