Description

Link.

修改边权的动态 MST。

Solution

讲清楚点。

修改边权的 MST,考虑对时间分治。设我们当前操作的操作区间是 \([l,r]\),直接暴力找 MST 是不行的。

考虑找出必要的边和必不要的边。

  • 若把 \([l,r]\) 操作中的边边权改成 \(+\infty\),拿原图点集和不包含 \([l,r]\) 中边的边集和 \([l,r]\) 中边权修改为 \(+\infty\) 后的边的集合的并集作为边集跑 MST,此时如果不在 MST 上的边一定不在最终的 MST 边集中。

  • 同理,改成 \(-\infty\),此时在 MST 边集里的边一定在最终的 MST 边集中。

这样暴力跑 Kruskal 的规模保证在了 \(O(r-l+1)\)。

复杂度 \(O(n\log_{2}^{2}n)\)。

#include<bits/stdc++.h>
const int INF=std::numeric_limits<int>::max();
struct edge
{
int fr,ba,val,ID;
edge():fr(0),ba(0),val(0),ID(0){}
edge(int _fr,int _ba,int _val,int _id):fr(_fr),ba(_ba),val(_val),ID(_id){}
friend bool operator < (const edge &lhs,const edge &rhs){return lhs.val<rhs.val;}
}edge_set[20][100010],ori_edge[100010],tmp_edge[100010];
struct oper
{
int ID,val;
oper():ID(0),val(0){}
oper(int _id,int _val):ID(_id),val(_val){}
}ope[100010];
int tagcur[100010],tagope[100010],n,m,q,size_v[20],size_e[20],ver_set[20][100010],wgt[100010],srt[100010];
struct DSU
{
int fa[100010];
int f(int i){return fa[i];}
void clear(int l){std::iota(fa+1,fa+l+1,1);}
int find(int x){return (x^fa[x])?fa[x]=find(fa[x]):x;}
bool merge(int x,int y){x=find(x),y=find(y); if(x^y) return fa[x]=y,true; else return false;}
}dsu;
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<<3)+(x<<1)+(c^'0'),c=getchar();
if(~f) return x;
else return -x;
}
int wrstk[100];
void write(long long x,char las='\n')
{
int top=0;
if(x<0) x=-x,putchar('-');
do wrstk[++top]=x%10,x/=10; while(x);
while(top) putchar(wrstk[top--]^'0');
putchar(las);
}
void rawgrass(int l,int r,int dep,long long ans)
{
const int &n=size_v[dep],&m=size_e[dep];
if(l^r)
{
for(int i=1;i<=m;++i) tagope[edge_set[dep][i].ID]=0;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=1;
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tagcur[tmp_edge[i].ID]) tmp_edge[i].val=INF;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(!dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba) && tmp_edge[i].val!=INF) tagope[tmp_edge[i].ID]=-1;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=1;
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tagcur[tmp_edge[i].ID]) tmp_edge[i].val=-INF;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba) && tmp_edge[i].val!=-INF) tagope[tmp_edge[i].ID]=1;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=0;
size_v[dep+1]=size_e[dep+1]=0;
dsu.clear(n);
for(int i=1;i<=m;++i) if(tagope[edge_set[dep][i].ID]==1) dsu.merge(edge_set[dep][i].fr,edge_set[dep][i].ba);
for(int i=1;i<=n;++i) if(dsu.f(i)==i) ver_set[dep+1][++size_v[dep+1]]=ver_set[dep][i],srt[i]=size_v[dep+1];
for(int i=1;i<=m;++i)
{
if(tagope[edge_set[dep][i].ID]==1) ans+=edge_set[dep][i].val;
else if(tagope[edge_set[dep][i].ID]==0)
{
int x=edge_set[dep][i].fr,y=edge_set[dep][i].ba;
x=dsu.find(x),y=dsu.find(y);
if(x^y) edge_set[dep+1][++size_e[dep+1]]=edge(srt[x],srt[y],edge_set[dep][i].val,edge_set[dep][i].ID);
}
}
int mid=(l+r)>>1;
rawgrass(l,mid,dep+1,ans);
for(int i=l;i<=mid;++i) wgt[ope[i].ID]=ope[i].val;
for(int i=1;i<=size_e[dep+1];++i) if(wgt[edge_set[dep+1][i].ID]!=INF) edge_set[dep+1][i].val=wgt[edge_set[dep+1][i].ID];
for(int i=l;i<=mid;++i) wgt[ope[i].ID]=INF;
rawgrass(mid+1,r,dep+1,ans);
}
else
{
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tmp_edge[i].ID==ope[l].ID) tmp_edge[i].val=ope[l].val;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba)) ans+=tmp_edge[i].val;
write(ans);
}
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1,x,y,z;i<=m;++i) x=read(),y=read(),z=read(),ori_edge[i]=edge(x,y,z,i);
for(int i=1,id,k;i<=q;++i) id=read(),k=read(),ope[i]=oper(id,k);
size_v[0]=n;
size_e[0]=m;
for(int i=1;i<=size_v[0];++i) ver_set[0][i]=i;
for(int i=1;i<=size_e[0];++i) edge_set[0][i]=ori_edge[i],wgt[i]=INF;
rawgrass(1,q,0,0);
return 0;
}

Solution -「HNOI 2010」城市建设的更多相关文章

  1. Solution -「HNOI 2009」「洛谷 P4727」图的同构计数

    \(\mathcal{Description}\)   Link.   求含 \(n\) 个点的无标号简单无向图的个数,答案模 \(997\). \(\mathcal{Solution}\)   首先 ...

  2. Solution -「HNOI 2019」「洛谷 P5293」白兔之舞

    \(\mathcal{Description}\)   Link.   不想概括题意.jpg \(\mathcal{Solution}\)   定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...

  3. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  4. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  5. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  6. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  7. Solution -「JOISC 2021」「LOJ #3491」道路建设

    \(\mathcal{Description}\)   Link.   平面上有 \(n\) 个互不重合的点 \((x_{1..n},y_{1..n})\),求其两两曼哈顿距离的前 \(m\) 小值. ...

  8. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  9. Solution -「HNOI」EVACUATE

    Sol. 可以发现人的移动除了不能穿墙以外没有别的限制.也就是说人的移动多半不是解题的突破口. 接下来会发现出口的限制很强,即出口每个时刻只能允许一个人出去. 每个时刻? 不难想到对于每一个时刻每一个 ...

  10. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

随机推荐

  1. ImageMagick 图像处理学习笔记

    Use ImageMagick to create, edit, compose, or convert bitmap images. It can read and write images in ...

  2. 顶级生物信息学 RSS 订阅源

    早在 2018 年的时候我在"生信草堂"的公众号上写过一篇关于 RSS 的文章<使用 RSS 打造你的科研资讯头条>,介绍了关于 RSS 的一些内容和如何使用 inor ...

  3. 花了半天时间,使用spring-boot实现动态数据源,切换自如

      在一个项目中使用多个数据源的情况很多,所以动态切换数据源是项目中标配的功能,当然网上有相关的依赖可以使用,比如动态数据源,其依赖为, <dependency> <groupId& ...

  4. docker-compose单服务器部署ELK

    docker-compose 部署ELK 本项目采用的ELK版本为6.5.3,7.0+ 以上的版本部分配置不适合,请查看docker-compose多服务器部署ELK文章 目录结构 elk |--do ...

  5. 如何使用libavfilter库给输入文件input.yuv添加视频滤镜?

    一.视频滤镜初始化 本次代码实现的是给输入视频文件添加水平翻转滤镜,在视频滤镜初始化部分我们可以分为以下几步进行: 1.创建滤镜图结构 视频滤镜功能最核心的结构为滤镜图结构,即AVFilterGrap ...

  6. Windows下打开指定目录并定位到具体文件

    一.在Windows上,网上流传的几种方法可以打开目录并定位到指定文件: 1.使用系统调用: 使用system()函数执行操作系统的命令行命令. 在命令行命令中,使用explorer /select, ...

  7. iOS Block笔记总结

    前言: 对block的简单笔记总结, 1.本质: 封装了函数调用和函数调用环境的对象 2.block结构: 3.block捕获变量: 由于需要跨函数访问变量,所以需要捕获变量,(防止访问时已被销毁)  ...

  8. 即构SDK7月迭代:新增支持按通道设置延迟模式,让卡顿大大减少

    即构SDK 7月迭代如期而至,本月SDK更新主要增加了按推流通道设置延迟模式,大大减少了直播卡顿:媒体本地录制新增AAC 格式,可生成更小的录制文件,更易于上传.此外还有多项功能的优化,让用户获得更好 ...

  9. debezium同步postgresql数据至kafka

    0 实验环境 全部部署于本地虚拟机 debezium docker部署 postgresql.kafka本机部署 1 postgresql 1.1 配置 设置postgres密码为123 仿照exam ...

  10. pip install mysqlclient命令安装mysqlclient失败的解决办法

    错误情况: 解决方法: 到这个地址下载自己版本对应的资源 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 如下图: 我这里首先下载了  ...