【Luogu】 P3206 [HNOI2010] 城市建设

2023-10-03 22:54

本文主要是介绍【Luogu】 P3206 [HNOI2010] 城市建设,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

点击打开链接

题目解法

动态 m s t mst mst 板板题~

考虑类似于线段树分治的做法
我们需要把边划分成静态边和动态边
动态边是当前分治区间 [ l , r ] [l,r] [l,r] 中修改的边,其他边是静态边
我们考虑到静态边的边集太大,考虑缩小范围,不难想到 答案加上必选边 和 删去无用边

  1. 令动态边的边权为 − ∞ -\infty ,这样仍在 m s t mst mst 中的边就是必选边(在区间 [ l , r ] [l,r] [l,r] 中的任何一个子区间都是)
  2. 令动态边的边权为 + ∞ +\infty +,这样不在 m s t mst mst 中的边就是无用边(在区间 [ l , r ] [l,r] [l,r] 中的任何一个子区间都是)

对于必选边,我们需要把它们缩点
然后不要忘记把除了删边其他的 u , v u,v u,v 全部改成缩点之后的集合
我们提前加上必选边的贡献,且删去无用边之后,不难发现,静态边的个数是 O ( r − l + 1 ) O(r-l+1) O(rl+1) 级别的
且有一个非常重要的性质是,我们在分治树上一层一层往下递归时,静态边是递减的,这样可以缩小问题规模
最后当 l = r l=r l=r 时,做一遍 m s t mst mst 即可
时间复杂度 O ( q l o g m ) O(qlogm) O(qlogm)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20100,M=50100,inf=1e9;
struct Lines{ int x,y,z,id;}e[20][M],f[M],tmp[M],t[M];
struct Updt{ int x,d;}upd[M];
int n,m,q,c[M],fa[N],rv[M],totE[20];
LL ans[M];
inline int read(){int FF=0,RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;return FF*RR;
}
void _clear(int curE){ for(int i=1;i<=curE;i++) fa[f[i].x]=f[i].x,fa[f[i].y]=f[i].y;}
void _sort(int curE){ sort(f+1,f+curE+1,[](const Lines &i,const Lines &j){ return i.z<j.z;});}
int get_father(int x){ return x==fa[x]?x:fa[x]=get_father(fa[x]);}
void slv1(int &curE,LL &mst){_sort(curE),_clear(curE);int cnt=0;for(int i=1;i<=curE;i++){int fax=get_father(f[i].x),fay=get_father(f[i].y);if(fax!=fay) fa[fax]=fay,t[++cnt]=f[i];}_clear(curE);for(int i=1;i<=cnt;i++) if(t[i].z!=-inf) mst+=t[i].z,fa[get_father(t[i].x)]=get_father(t[i].y);int sz=0;for(int i=1;i<=curE;i++){int fax=get_father(f[i].x),fay=get_father(f[i].y);if(fax!=fay) f[i].x=fax,f[i].y=fay,tmp[++sz]=f[i];}for(int i=1;i<=sz;i++) f[i]=tmp[i],rv[f[i].id]=i;curE=sz;
}
void slv2(int &curE){_sort(curE),_clear(curE);int sz=0;for(int i=1;i<=curE;i++){int fax=get_father(f[i].x),fay=get_father(f[i].y);if(fax!=fay) fa[fax]=fay,tmp[++sz]=f[i];else if(f[i].z==inf) tmp[++sz]=f[i];}for(int i=1;i<=sz;i++) f[i]=tmp[i],rv[f[i].id]=i;curE=sz;
}
void solve(int l,int r,int depth,LL mst){int curE=totE[depth];if(l==r) c[upd[l].x]=upd[l].d;for(int i=1;i<=curE;i++){e[depth][i].z=c[e[depth][i].id];f[i]=e[depth][i],rv[f[i].id]=i;}if(l==r){ans[l]=mst;_sort(curE),_clear(curE);for(int i=1;i<=curE;i++){int fax=get_father(f[i].x),fay=get_father(f[i].y);if(fax!=fay) fa[fax]=fay,ans[l]+=f[i].z;}return;}for(int i=l;i<=r;i++) f[rv[upd[i].x]].z=-inf;slv1(curE,mst);for(int i=l;i<=r;i++) f[rv[upd[i].x]].z=inf;slv2(curE);for(int i=1;i<=curE;i++) e[depth+1][i]=f[i];totE[depth+1]=curE;int mid=(l+r)>>1;solve(l,mid,depth+1,mst),solve(mid+1,r,depth+1,mst);
}
int main(){n=read(),m=read(),q=read();for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();e[0][i]={x,y,z,i},c[i]=z;}for(int i=1;i<=q;i++) upd[i].x=read(),upd[i].d=read();totE[0]=m,solve(1,q,0,0);for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));return 0;
}

这篇关于【Luogu】 P3206 [HNOI2010] 城市建设的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839

相关文章

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【信创建设】信息系统信创建设整体技方案(word原件完整版)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可掌控、可研究、可发展、可生产。信创发展是一项国家战略,也是当今形势下国家经济发展的新功能。信创产业发展已经成为各行各业数字化转型、提升产业链发展的关键。 软件全套资料部分文档清单: 工作安排任

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

《语文建设》

语文建设栏目设置 新理念、新教材(教材研究、新课文、教学设计)、新课程新课堂(案例、教学短讯、综合性学习、创新瞬间)、更新知识(国外语文教育、美文共赏、课文新解、咬文嚼字、语言规范与应用、语言新观察、评价与考试。 语文建设编辑部/杂志社投稿须知 1、文章标题简短,能概括中心思想,一般不超过20个汉字,必要时加副标题 2、题目下面均应写作者姓名,姓名下面写单位名称、所在城市、邮编,不同单位的多位作者

FHQ Treap模版(luogu P3369)

FHQ Treap模版(自用),带注释 #include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,root,idx;struct node{int l,r;int val,key,size;}tr[N];int getnew(int v){tr[++idx].val=v;//权值tr[idx].key=rand(

【网络安全 | 甲方建设】SaaS平台、Jira工具及Jenkins服务器

原创文章,不得转载。 文章目录 SaaS平台友好性 Jira友好性 Jenkins友好性 SaaS平台 SaaS,全称为 “Software as a Service”(软件即服务),是一种基于云计算的软件交付模型。在这种模型中,软件不需要用户在本地安装和维护,而是通过互联网访问和使用。软件通常由服务提供商托管,用户只需通过浏览器或轻量级客户端连接到远程服务器即可使用

【网络安全 | 甲方建设】开发、测试、部署关键词详解

原创文章,不得转载。 文章目录 需求与开发原生需求重构新增服务调用 测试与覆盖率单元测试增量代码单测UT覆盖率CR前覆盖率APP回归测试回归测试自动化冒烟 部署与环境Stable环境部署待部署服务名称代码分支待部署代码分支PR链接灰度发布蓝绿发布Canary发布热修复(Hotfix)Mock环境Redis非Cluster模式Nacos变更 持续集成与交付持续集成(CI)持续交付(C

【自然语言处理 词库建设】怎样将搜狗的细胞词库scel格式转化成txt格式

搜狗词库:https://pinyin.sogou.com/dict/ 1、先下载搜狗词库到本地,文件格式为.scel后缀 2、利用python3 自动转换成txt python3版本: # -*- coding:utf-8 -*-import structimport os# 由于原代码不适用python3且有大量bug# 以及有函数没有必要使用且一些代码书写不太规范或冗余#在原有

199页Word智慧水务平台建设方案

业务需求分析 3.1 主要业务描述 (1)调度中心主要业务描述 配套工程调度中心为一级调度机构,同时也是水务集团原水供水的统一调度中心。 调度中心是配套工程全线水量调度的总负责单位,负责全线供水计划和调度计划的制定、工程技术管理、运行管理、水量监控、工程安全监测、水质监测、工程防洪、信息化系统管理、财务与资产管理、水费征收等。调度中心可对各现地站机电设备实现远程监控。 (2)分调中心主要

魅族持续交付平台建设实践

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 原文转载自:msup 文章内容来自第10期魅族开放日魅族科技运维架构师古日旗的现场分享 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 一 自动化建设历程 1.1 魅族互联网发展的时间线 2003-2008年被称之为“互联网1.0时代”。2003年,源于对音乐的梦想