题解 洛谷 P5443 【[APIO2019]桥梁】
考虑若只有查询操作,那么就可以构造\(Kruskal\)重构树,然后在线询问了,也可以更简单的把询问离线,把询问和边都按权值从大到小排序,然后双指针依次加入对于当前询问合法的边,用并查集维护每个点的答案即可。
现在加上修改操作,考虑可以对所有操作分块,对块内所有询问操作排序,和之前的离线做法一样,用双指针依次加边。
但是有些边会在块内这些操作中涉及修改,那么对于每个询问,暴力扫一遍块内的修改操作,若一个修改操作在当前询问的时间点之前,那么就执行对应边的修改,执行完所有能够执行的修改后,再考虑这些涉及修改的边,加入合法的。
当指针扫到下一个询问时,因为询问已经不再是按时间顺序,所以有可能上一个询问执行的一些修改在当前询问不能生效,所以用可撤销并查集把除了不涉及修改的边都撤销掉,然后就和之前处理询问的过程一样了。
设块大小为\(S\),对于一个块,需要对边排序和处理询问,处理询问时需要枚举所有的修改和用可撤销并查集来维护,那么处理一个块的复杂度为\(O(m\log m + S^2 \log n)\),总共\(\frac{q}{S}\)个块,所以总复杂度就为\(O(\frac{q m\log m}{S}+ qS \log n)\),块大小取\(\sqrt{m\log m}\)时会比较快。
\(code:\)
#include<bits/stdc++.h>
#define maxn 200010
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,m,S,qu,tot,top,cnt1,cnt2;
int ans[maxn],fa[maxn],siz[maxn],bel[maxn],val[maxn];
bool vis[maxn];
struct edge
{
int x,y,v,id;
}e[maxn];
bool cmp1(const edge &a,const edge &b)
{
return a.v>b.v;
}
struct query
{
int x,v,id,opt;
}q[maxn],q1[maxn],q2[maxn];
bool cmp2(const query &a,const query &b)
{
return a.v>b.v;
}
struct node
{
int x,y;
}st[maxn];
int find(int x)
{
return fa[x]==x?x:find(fa[x]);
}
void merge(int x,int y)
{
int rx=find(x),ry=find(y);
if(rx==ry) return;
if(siz[rx]<siz[ry]) swap(rx,ry);
st[++top]=(node){rx,ry};
fa[ry]=rx,siz[rx]+=siz[ry];
}
void del(int id)
{
int x=st[id].x,y=st[id].y;
fa[y]=y,siz[x]-=siz[y];
}
void init()
{
top=cnt1=cnt2=0,sort(e+1,e+m+1,cmp1);
for(int i=1;i<=n;++i) fa[i]=i,siz[i]=1;
for(int i=1;i<=m;++i) val[i]=vis[i]=0,bel[e[i].id]=i;
for(int i=1;i<=tot;++i)
{
if(q[i].opt==1) q1[++cnt1]=q[i],vis[q[i].x]=true;
else q2[++cnt2]=q[i];
}
sort(q2+1,q2+cnt2+1,cmp2);
}
void work()
{
init();
int now,pos=1;
for(int i=1;i<=cnt2;++i)
{
int x=q2[i].x,v=q2[i].v,id=q2[i].id;
while(e[pos].v>=v)
{
if(!vis[e[pos].id])
merge(e[pos].x,e[pos].y);
pos++;
}
now=top;
for(int j=1;j<=cnt1;++j)
val[q1[j].x]=e[bel[q1[j].x]].v;
for(int j=1;j<=cnt1;++j)
if(q1[j].id<id)
val[q1[j].x]=q1[j].v;
for(int j=1;j<=cnt1;++j)
if(val[q1[j].x]>=v)
merge(e[bel[q1[j].x]].x,e[bel[q1[j].x]].y);
ans[id]=siz[find(x)];
while(top>now) del(top--);
}
for(int i=1;i<=cnt1;++i) e[bel[q1[i].x]].v=q1[i].v;
}
int main()
{
read(n),read(m),S=sqrt(m*log2(m));
for(int i=1;i<=m;++i)
read(e[i].x),read(e[i].y),read(e[i].v),e[i].id=i;
read(qu);
for(int i=1;i<=qu;++i)
{
q[++tot].id=i,read(q[tot].opt);
read(q[tot].x),read(q[tot].v);
if(tot==S) work(),tot=0;
}
if(tot) work();
for(int i=1;i<=qu;++i)
if(ans[i])
printf("%d\n",ans[i]);
return 0;
}
题解 洛谷 P5443 【[APIO2019]桥梁】的更多相关文章
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
- 题解 洛谷P2158 【[SDOI2008]仪仗队】
本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...
随机推荐
- loadRunnner中90%的响应时间
参考博客https://blog.csdn.net/lengyue_112/article/details/1095320?utm_source=blogxgwz4 LR在场景执行完了会出个报告,其中 ...
- 【SpringBoot MQ 系列】RabbitListener 消费基本使用姿势介绍
[MQ 系列]RabbitListener 消费基本使用姿势介绍 之前介绍了 rabbitmq 的消息发送姿势,既然有发送,当然就得有消费者,在 SpringBoot 环境下,消费可以说比较简单了,借 ...
- Linux hostname主机名配置文件/etc/hosts详解
这篇文章为大家介绍linux hostname主机名配置文件/etc/hosts,包括主机名的用途.配置文件的操作方法等,有需要的朋友,可以参考下 1.什么是Linux主机名 无论在局域网还是INTE ...
- Spring FactoryBean 缓存
相关文章 Spring 整体架构 编译Spring5.2.0源码 Spring-资源加载 Spring 容器的初始化 Spring-AliasRegistry Spring 获取单例流程(一) Spr ...
- sql server 分组查询结合日期模糊查询
分组查询: https://www.cnblogs.com/netserver/p/4518995.html 日期格式化格式: http://blog.csdn.net/qq_16769857/art ...
- linux就该这么学 第一天学习笔记
题外话 在每天的网上冲浪中,一次无意间的点击,发现了linux就该这么学的网站,然后就看了一晚上,当时还是学生的我特别想要参加培训,可是碍于眼前的经济状况,只得将这个想法深深的藏在了心里,并加了一下网 ...
- 浅谈JVM和垃圾回收
写在前面 简单的介绍一下JVM(Java Virtual Machine)吧,它也叫Java虚拟机.虽然它叫虚拟机,但是实际上不是我们所理解的虚拟机,它更像操作系统中的一个进程.JVM屏蔽了各个操作系 ...
- Java实现 第十一届蓝桥杯——超级胶水(渴望有题目的大佬能给小编提供一下题目,讨论群:99979568)
PS: 好久没写过算法题了,总感觉自己写的思路没问题,但是结果就是不对,希望哪位大佬有时间能给找找问题 超级胶水 小明有n颗石子,按顺序摆成一排,他准备用胶水将这些石子黏在一起. 梅克什字有自己的重量 ...
- fastjson到底做错了什么?为什么会被频繁爆出漏洞?
GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...
- SCOI 2009 围豆豆(状压DP)
SCOI 2009 围豆豆 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧. 游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗 ...