UOJ小清新题表

题目内容

UOJ链接

DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况:

Add a b: 表示在\(a\)与\(b\)之间连了一条长度为\(i\)的边(注意,\(i\)是操作编号)。保证\(1≤a,b≤n\)。

Delete k: 表示删除了当前图中边权最大的k条边。保证k一定不会比当前图中边的条数多。

Return: 表示撤销第$ i−1$次操作。保证第\(1\)次操作不是Return且第\(i−1\)次不是Return操作。

请你在每次操作后告诉DZY当前图的最小生成树边权和。如果最小生成树不存在则输出 0

数据范围

\(1\leq n\leq 3\times 10^5,1\leq m\leq 5\times 10^5\)

思路

很好的一道题,顺便学了下按秩合并

先考虑没有Return的情况,那么只需考虑删边的情况。如果你要使用路径压缩的话删边会很麻烦,那么就用按秩合并的策略,没加入一条边将一直保持不变直至其被删除(没错,通俗点就是直接删了),操作次数为\(m\),最多加入的边数也就只有\(O(m)\)而已。加上按秩合并每次操作\(\log n\),总的时间效率是\(O(n\log n)\)。可以获得70分的部分分。

此时有神犇表示可持久化并查集!

注意看比赛题目,UOJ Easy Round,显然可持久化不星

所以实际上我们只需要采用离线的策略。当我们执行第\(i\)个操作的时候就可以知道第\(i+1\)的操作是否为Return操作。

对于当前为Add操作,你可以选择直接把Return改成Delete

如果当前是Delete操作的话,我们可以事先存下还没有删除的时候的答案,直接一起输出即可。

时间效率\(O(n\log n)\),期望得分 40 100。(如果你不像我一样犯nt错误的话)

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+10;
int n,m,tot,kcnt;
int fa[maxn],siz[maxn],mem[maxn];
ll ans[maxn];//记录图中有i条边时的答案ans[i]
stack<int> sta; struct Node{
char opt[5];
int x,y;
}q[maxn]; inline int read(){
int x=0,fopt=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')fopt=-1;
ch=getchar();
}
while(isdigit(ch)){
x=(x<<3)+(x<<1)+ch-48;
ch=getchar();
}
return x*fopt;
} inline int Find(int x){
return x==fa[x]?x:Find(fa[x]);//别路径压缩了
} inline void Merge(int x,int y,int w){
int fx=Find(x),fy=Find(y);
sta.push(w);
if(fx==fy)return mem[w]=-1,void();
if(siz[fx]>siz[fy])swap(fx,fy);
fa[fx]=fy;
/*while(fa[fy]!=fy){
siz[fy]+=siz[fx];
fy=fa[fy];
}*///如果你这么写就会获得40分的好成绩
while(1){
siz[fy]+=siz[fx];
fy=fa[fy];
if(fa[fy]==fy)break;
}//原因是一开始就连自己的情况没有往上跳而直接略过去了
mem[w]=fx;
} inline void Del(int x){
int fx=fa[x];
while(fa[fx]!=fx){
siz[fx]-=siz[x];
fx=fa[fx];
}//由于删除的时候至少是两个点相连的所以这里没关系
fa[x]=x;
} void Solve(){
ll res=0;
for(int i=1;i<=m;i++){
if(q[i].opt[0]=='A'){
Merge(q[i].x,q[i].y,i);
if(~mem[i])res+=i,kcnt++;
ans[++tot]=(kcnt<n-1)?0:res;
printf("%lld\n",ans[tot]);
if(q[i+1].opt[0]=='R'){
q[i+1].opt[0]='D';
q[i+1].x=1;
}
}else if(q[i].opt[0]=='D'){
if(q[i+1].opt[0]=='R'){
printf("%lld\n%lld\n",ans[tot-q[i].x],ans[tot]);
continue;//直接一次性输出两个就行了
}
while(q[i].x--){
int u=sta.top();
sta.pop();tot--;
if(mem[u]==-1)continue;
Del(mem[u]);
res-=u;kcnt--;
}
ans[tot]=(kcnt<n-1)?0:res;
printf("%lld\n",ans[tot]);
}
}
} void Init(){
for(int i=1;i<=n;i++){
fa[i]=i;
siz[i]=1;
}
} int main(){
n=read();m=read();
Init();
for(int i=1;i<=m;i++){
bool flag=0;
scanf("%s",q[i].opt);
if(q[i].opt[0]=='A')
q[i].x=read(),q[i].y=read();
else if(q[i].opt[0]=='D')
q[i].x=read();
}
Solve();
return 0;
}

关于代码高亮,他好像SPFA了他好了

【UER #1】DZY Loves Graph的更多相关文章

  1. 【UOJ #14】【UER #1】DZY Loves Graph

    http://uoj.ac/problem/14 题解很好的~ 不带路径压缩的并查集能保留树的原本形态. 按秩合并并查集可以不用路径压缩,但是因为此题要删除,如果把深度当为秩的话不好更新秩的值,所以把 ...

  2. 【UER #1】DZY Loves Graph(待卡常数)

    题解: 正解是可持久化并查集 但这个显然是lct可以维护的 但这常数是个问题啊??? #include <bits/stdc++.h> using namespace std; struc ...

  3. uoj #14.【UER #1】DZY Loves Graph

    http://uoj.ac/problem/14 由于加入的边权递增,可以直接运行kruskal并支持撤销,但这样如果反复批量删边和撤销,时间复杂度会退化,因此需要对删边操作加上延时处理,只有在删边后 ...

  4. 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)

    传送门 题意简述: 要求支持以下操作: 在a与b之间连一条长度为i的边(i是操作编号):删除当前图中边权最大的k条边:表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作. 要求在每次操作后 ...

  5. UOJ_14_【UER #1】DZY Loves Graph_并查集

    UOJ_14_[UER #1]DZY Loves Graph_并查集 题面:http://uoj.ac/problem/14 考虑只有前两个操作怎么做. 每次删除一定是从后往前删,并且被删的边如果不是 ...

  6. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  7. 【BZOJ3563/BZOJ3569】DZY Loves Chinese I/II(随机化,线性基)

    [BZOJ3563/BZOJ3569]DZY Loves Chinese I/II(随机化,线性基) 题面 搞笑版本 正经版本 题面请自行观赏 注意细节. 题解 搞笑版本真的是用来搞笑的 所以我们来讲 ...

  8. 【BZOJ3563/3569】DZY Loves Chinese II 线性基神题

    [BZOJ3563/3569]DZY Loves Chinese II Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以 ...

  9. 【bzoj 3309 】 DZY Loves Math

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...

随机推荐

  1. Windows7上开启ftp服务器功能

    开启ftp服务功能   1 进入“控制面板”->“程序”->"打开或关闭Windows功能",找到“Internet信息服务”选项 2 将“Internet信息服务”选 ...

  2. SpringCloud-config分布式配置

    为什么要统一管理微服务配置? 随着微服务不断的增多,每个微服务都有自己对应的配置文件.在研发过程中有测试环境.UAT环境.生产环境,因此每个微服务又对应至少三个不同环境的配置文件.这么多的配置文件,如 ...

  3. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  4. js中的鼠标滚轮事件

    ## 事件对象 event 1 event事件对象,表示用来获取事件的详细信息,比如得到鼠标的横坐标:事件对象.clientX(clientX是可视区坐标) window.onclick = func ...

  5. 分布式系统监视zabbix讲解二之邮件报警通知

    概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...

  6. kubernetes部署Percona XtraDB Cluster集群

    PXC介绍 全称percona-xtradb-cluster,提供了MySQL高可用的一种实现方法.PXC集群以节点组成(推荐至少3节点,便于故障恢复),每个节点都是基于常规的 MySQL Serve ...

  7. 渗透测试方法论(qf总结)

    渗透测试(penetration testing , pentest)是实施安全评估(即审计)的具体手段.方法论是在指定.实施信息安全审计方案时,需要遵循的规则.惯例和过程.人们在评估网路.应用.系统 ...

  8. C++实现职工管理系统(下)

    C++实现职工管理系统(下) 大家好,今天是在博客园的第十五天,博主今天给大家带来的是职工管理系统(C++)(下) 这次的随笔记录是实现(中)结语处说的几个功能,另外新增一个修改功能 此次要实现的功能 ...

  9. 记录jmeter使用beanshell断言获取复杂的json字符串参数值

    实战示例 测试场景 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式 ...

  10. 关于Xilinx PCIE DMA的问答

    关于Xilinx PCIE DMA的问答 很久没上博客园了,但由于之前在博客园写了几篇关于PCIE DMA的文章,很多同学给我发消息询问相关知识点,之前有空的时候都是语音一小时跟人细讲,最近由于工作繁 ...