题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001

cdq分治+重建图。

可以保留当前一定会被选的非修改边然后把点缩起来。这样的话每次点数至多只有r-l+1个,边数只有2*(r-l+1)-1个(生成树+修改边)。

时间复杂度O(nlog^2(n))

#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 50050
#define ll long long
#define inf 1000000000
using namespace std;
struct data{int x,y;ll z;int k,id;
}a[][maxn];
struct node{int k;ll w;int id;
}b[maxn];
int fa[maxn],pos[maxn],p[maxn],n,m,Q;
ll dis[maxn];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
int find(int x){
if (fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
bool cmp(data a,data b){
return a.z<b.z;
}
void cdq(int dep,int l,int r,int n,int m,ll ans){
rep(i,,m){
data &c=a[dep][i],&c2=a[dep-][i];
a[dep][i]=(data){c2.x,c2.y,dis[c2.id],,c2.id};
pos[c.id]=i;
}
//当l=r,计算答案,直接赋值当前修改边。
if (l==r){
data &c=a[dep][pos[b[l].k]]; c.z=dis[c.id]=b[l].w;
rep(i,,n) fa[i]=i;
sort(a[dep]+,a[dep]++m,cmp);
rep(i,,m){
int x=find(a[dep][i].x),y=find(a[dep][i].y);
if (x!=y) fa[x]=y,ans+=a[dep][i].z;
}
printf("%lld\n",ans);
return;
}
//删边,如果k=0,那么这是一条无用的边。
rep(i,l,r) a[dep][pos[b[i].k]].k=;
rep(i,,n) fa[i]=i;
sort(a[dep]+,a[dep]++m,cmp);
rep(i,,m) if (a[dep][i].k==){
int x=find(a[dep][i].x),y=find(a[dep][i].y);
if (x!=y) fa[x]=y,a[dep][i].k=;
}
//删点,找出必连边(k=3)
rep(i,,m) if (a[dep][i].k==) a[dep][i].z=-inf;
rep(i,,n) fa[i]=i;
sort(a[dep]+,a[dep]++m,cmp);
rep(i,,m) if (a[dep][i].k!=){
int x=find(a[dep][i].x),y=find(a[dep][i].y);
if (x!=y) {
fa[x]=y;
if (a[dep][i].k!=) a[dep][i].k=;
}
}
//重建,把必连边(k=3)取为答案,将两端点缩为一个点。
rep(i,,n) fa[i]=i;
rep(i,,m) if (a[dep][i].k==){
data &c=a[dep][i];
int x=find(c.x),y=find(c.y);
if (x!=y) fa[x]=y, ans+=c.z;
}
int nn=,nm=;
rep(i,,n) p[i]=;
rep(i,,n) if (!p[find(i)]) p[find(i)]=++nn;
rep(i,,m) if (a[dep][i].k!=){
int x=find(a[dep][i].x),y=find(a[dep][i].y);
data &c=a[dep][i];
if (x!=y) a[dep][++nm]=(data){p[x],p[y],c.z,c.k,c.id};
}
int mid=(l+r)/;
cdq(dep+,l,mid,nn,nm,ans);
cdq(dep+,mid+,r,nn,nm,ans);
}
int main(){
n=read(); m=read(); Q=read();
int x,y; ll z;
rep(i,,m){
x=read(); y=read(); z=read();
a[][i]=(data){x,y,z,,i};
}
rep(i,,Q){
x=read(); y=read();
b[i]=(node){x,y,i};
}
rep(i,,m) dis[a[][i].id]=a[][i].z;
cdq(,,Q,n,m,);
return ;
}

BZOJ2001: [Hnoi2010]City 城市建设的更多相关文章

  1. BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Lou ...

  2. BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】

    题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上 ...

  3. 【BZOJ2001】 [Hnoi2010]City 城市建设

    BZOJ2001 [Hnoi2010]City 城市建设 Solution 我们考虑一下这个东西怎么求解? 思考无果...... 咦? 好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除, ...

  4. BZOJ 2001: [Hnoi2010]City 城市建设

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 555[Submit][ ...

  5. 【bzoj2001】 Hnoi2010—City 城市建设

    http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...

  6. 2001: [Hnoi2010]City 城市建设 - BZOJ

    DescriptionPS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的 ...

  7. 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设

    Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少 ...

  8. [HNOI2010]CITY 城市建设

    问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面 ...

  9. 【HNOI2010】城市建设(对时间分治 & Kruskal)

    Description \(n\) 个点 \(m\) 条边的带边权无向图.\(q\) 次操作,每次修改一条边的权值. 求每次修改后的最小生成树的边权和. Hint \(1\le n\le 2\time ...

随机推荐

  1. [C/C++语言标准] ISO C99/ ISO C11/ ISO C++11/ ISO C++14 Downloads

    语言法典,C/C++社区人手一份,技术讨(hu)论(peng)必备 ISO IEC C99 https://files.cnblogs.com/files/racaljk/ISO_C99.pdf IS ...

  2. Smart line Panel和S7-200的MPI通信

    1.系统组成 2.一个简单任务 3.设置S7-200的通信参数 1)新建工程,设置CPU类型 2)设置端口1的通讯参数PLC地址为2,波特率187.5kbps 组态 3)保存完成配置 4.组态Smar ...

  3. 【ASP.NET系列】详解Views

    描述 本片文章内容属于ASP.NET MVC系列视图篇,主要讲解View,大致内容如下: 1.Views文件夹讲解 2.View种类 3.Razor语法 4.对视图的基本操作 一   Views文件夹 ...

  4. 2.Nginx日常维护技巧

    Nginx日常维护技巧 Nginx配置正确性检查 nginx提供了配置文件调试功能,可以快速定义配置文件存在的问题.执行如下命令检测配置文件的正确性: [root@localhost 桌面]# whi ...

  5. 1.Nginx服务应用

    Nginx服务应用 Nginx的优点和作用 Nginx是一款高性能的HTTP和反向代理的服务器软件,还是一个IMAP/POP3/SMTP(邮件)代理服务器! Nginx在功能实现上都采用模块化结构设计 ...

  6. MySQL Replication 主从复制全方位解决方案

    1.1 主从复制基础概念 在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com ...

  7. MHA高可用架构与Atlas读写分离

    1.1 MHA简介 1.1.1 MHA软件介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton ...

  8. 基于编辑距离来判断词语相似度方法(scala版)

    词语相似性比较,最容易想到的就是编辑距离,也叫做Levenshtein Distance算法.在Python中是有现成的模块可以帮助做这个的,不过代码也很简单,我这边就用scala实现了一版. 编辑距 ...

  9. 8、公司的上市问题 - CEO之公司管理经验谈

    在公司发展到一定阶段之后,CEO就能够考虑公司上市的问题了.一条线路,就是先成立公司,进行投资,然后上市赚取利润,根据不同公司的总经理的想法不同而定.这条路是现在很多公司领导要求的做法.因为,通过发行 ...

  10. WPF下可编辑Header的Tab控件实现

    介绍 有这样一个需求,当用户双击Tab控件Header区域时, 希望可以直接编辑.对于WPF控件,提供一个ControlTemplate在加上一些Trigger就可以实现.效果如下: 代码 首先,我们 ...