显然可以用可持久化并查集实现。考虑更简单的做法。如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊。加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销,所以遇到一个要被撤销的删除操作时,直接求出去掉k条边后的MST即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 300010
#define M 500010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,m,fa[N],size[N],e[M],cnt,top;
char qwerty[10];
ll ans;
struct data{int op,x,y;
}q[M];
struct data2{int x,fa,s,i;ll sum;
}stk[N<<1];
int find(int x){return fa[x]==x?x:find(fa[x]);}
int merge(int x,int y,int i)
{x=find(x),y=find(y);if (x==y) return 0;if (size[x]<size[y]) swap(x,y);top++;stk[top].x=x;stk[top].fa=fa[x];stk[top].s=size[x];stk[top].i=i;stk[top].sum=stk[top-1].sum+i;top++;stk[top].x=y;stk[top].fa=fa[y];stk[top].s=size[y];stk[top].i=i;stk[top].sum=stk[top-1].sum+i;size[x]+=size[y],fa[y]=x;return i;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read();for (int i=1;i<=m;i++){char c=getc();if (c=='A') q[i].op=0,q[i].x=read(),q[i].y=read();if (c=='D') q[i].op=1,q[i].x=read();if (c=='R') q[i].op=2,cin>>qwerty;}for (int i=1;i<=n;i++) fa[i]=i,size[i]=1;for (int i=1;i<=m;i++){if (q[i].op==0) ans+=merge(q[i].x,q[i].y,i),e[++cnt]=i;if (q[i].op==1){int l=1,r=top,u=0;while (l<=r){int mid=l+r>>1;if (stk[mid].i<=e[cnt-q[i].x]) u=mid,l=mid+1;else r=mid-1;}ans=stk[u].sum>>1;if (q[i+1].op!=2){cnt-=q[i].x;while (stk[top].i>e[cnt]) fa[stk[top].x]=stk[top].fa,size[stk[top].x]=stk[top].s,top--;}}if (q[i].op==2){if (q[i-1].op==0){int x=0;while (stk[top].i==i-1) fa[stk[top].x]=stk[top].fa,size[stk[top].x]=stk[top].s,x+=stk[top].i,top--;ans-=x>>1;cnt--;}else ans=stk[top].sum/2;}if (top==(n-1<<1)&&ans==stk[top].sum/2) printf(LL,ans);else printf("0\n");//for (int j=1;j<=cnt;j++) cout<<e[j]<<' ';cout<<endl;//for (int j=2;j<=top;j+=2) cout<<stk[j].i<<' '<<stk[j].sum/2<<endl;//cout<<endl;}return 0;
}

  

转载于:https://www.cnblogs.com/Gloid/p/10738431.html

UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)相关推荐

  1. [UER #1] DZY Loves Graph

    题目描述 开始有 \(n\) 个点,现在对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况: \(Add\) a b: 表示在 \ ...

  2. UOJ14 DZY Loves Graph

    DZY开始有 nn 个点,现在他对这 nn 个点进行了 mm 次操作,对于第 ii 个操作(从 11 开始编号)有可能的三种情况: Add a b: 表示在 aa 与 bb 之间连了一条长度为 ii ...

  3. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  4. 【CF#505B】Mr. Kitayuta's Colorful Graph (并查集或Floyd或BFS)

    题干: Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The verti ...

  5. 4th 【最小生成树并查集】征兵

    征兵 [题目描述]: 一个国王,他拥有一个国家.最近他因为国库里钱太多了,闲着蛋疼要征集一只部队要保卫国家.他选定了N个女兵和M个男兵,但事实上每征集一个兵他就要花10000RMB,即使国库里钱再多也 ...

  6. DZY Loves Graph

    按秩合并的并查集支持删边操作. 附代码 #include <cstdio> #include <cstring> #include <algorithm> usin ...

  7. jzoj3237-间谍派遣【最小生成树,并查集】

    正题 题目大意 一张图,第iii个点参加任务需要mkimk_imki​元,连接一条边需要一定费用,要求每个联通图都有参加任务的点,求最小费用. 解题思路 其实就是求若干个最小生成树然后这个最小生成树的 ...

  8. jzoj2940-生成输入数据【最小生成树,并查集】

    正题 题目大意 给一个完全图的唯一一颗最小生成树,求完全图最小边权之和. 解题思路 我们考虑在计算最小生成树的时候,将两个联通块合并时,我们会选择连接这两个联通块的最小的边. 那么我们就可以让每个联通 ...

  9. D. Harmonious Graph【并查集】

    You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to n. The graph ...

最新文章

  1. java 必须存在默认构造器_Java默认构造方法在字节码的实现
  2. ASp.Net控件的生命周期
  3. 【Python】25个好用到爆的一行Python代码,建议收藏
  4. mysql查询父子关系树_swt 生成树[读取Mysql数据库中的父子关系表]
  5. Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法
  6. php通过js发送请求数据,使用原生javascript发送ajax请求数据的步骤
  7. 怎么看笔记本电脑的配置参数_想给笔记本电脑硬件配置升级,我应该怎么升?...
  8. GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器
  9. 数据--第48课 - 顺序表和有序表查找
  10. V20西门子变频器怎么选型
  11. 新装hbuilder无法运行到iOS模拟器/无法识别ios模拟器
  12. ps 绘制的 路径丢失了
  13. UVa 10608 - Friends(并查集)
  14. Rust 正则表达式 Regex
  15. apche的log4j.properties和log4j2.xml的配置和使用
  16. python打印九九乘法表到文件_99乘法表打印_python怎么打印九九乘法表
  17. 计算机博弈与创新人才培养,计算机博弈竞赛和创新人才培养模式探究.pdf
  18. (练习篇)萤火虫esp32与小爱音响---实现笔记本电脑唤醒
  19. 【大数据开发】SparkCore——统计广告topN、基站停留时间topN、ip地址统计练习
  20. 谷歌浏览器提示“要恢复页面吗?Chrome未正确关闭”

热门文章

  1. 线性系统的Matlab分析函数
  2. 《Python自动化》学习笔记:shutil模块使用介绍
  3. webview 禁用横竖屏切换_X5内核WebView横屏切换崩溃
  4. vc6 往mdb写入信息_HBase运维 | 一张表写入异常引起的HBase Replication 队列堆积
  5. AtCoder Beginner Contest 238
  6. 超大背包问题(二进制枚举 + 二分)
  7. linux进程自动启动,linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本
  8. 新加坡大数据初创公司 Latize 获 150 万美元风险融资
  9. Codeforces 86C Genetic engineering (AC自己主动机+dp)
  10. iOS开发--Runtime知识点整理