Description
PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁。Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费。Louis希望建造最少的道路使得国内所有的城市连通。但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你来完成这个任务。
Input
文件第一行包含三个整数N,M,Q,分别表示城市的数目,可以修建的道路个数,及收到的消息个数。 接下来M行,第i+1行有三个用空格隔开的整数Xi,Yi,Zi(1≤Xi,Yi≤n, 0≤Zi≤50000000),表示在城市Xi与城市Yi之间修建道路的代价为Zi。接下来Q行,每行包含两个数k,d,表示输入的第k个道路的修建代价修改为d(即将Zk修改为d)。
Output
输出包含Q行,第i行输出得知前i条消息后使城市连通的最小花费总和。
Sample Input
5 5 3
1 2 1
2 3 2
3 4 3
4 5 4
5 1 5
1 6
1 1
5 3

Sample Output
14
10
9
HINT

【数据规模】
对于20%的数据, n≤1000,m≤6000,Q≤6000。
有20%的数据,n≤1000,m≤50000,Q≤8000,修改后的代价不会比之前的代价低。
对于100%的数据, n≤20000,m≤50000,Q≤50000。

在机房小伙伴z55250825的耐心讲解下,认真的把他的代码抄了一遍(卧槽,还抄错了一次,卧槽,抄错的地方竟然是并查集的地方)

论文61页就是这道题,可以看一下

反正我是这么想的,这个分治是这样的

slove(l,r)

先把这个区间生成树的一定会选的边求出,把不需要的边删除,看起来好人性化的样子

contraction就是把一定会选的边计算出来,reduction就是把不会选的边去掉

论文中证明了它的复杂度,做法也在里面了,我就不说什么了,反正我也不会说

代码基本上是抄z55250825的,因为不会写啊

 const
maxn=;
inf=maxlongint;
type
edge=record
u,v,w,k:longint;
end;
g=array[..maxn]of edge;
var
e:array[..]of g;
t,tt:g;
f,d,size,qx,qy,sum,aa,pos:array[..maxn]of longint;
ans:array[..maxn]of int64;
n,m,q:longint; function find(x:longint):longint;
begin
if f[x]=x then exit(x);
f[x]:=find(f[x]);
exit(f[x]);
end; procedure union(u,v:longint);
begin
if u=v then exit;
if size[u]<size[v] then
begin
f[u]:=v;
inc(size[v],size[u]);
end
else
begin
f[v]:=u;
inc(size[u],size[v]);
end;
end; procedure sort(l,r:longint;var a:g);
var
i,j,y:longint;
t:edge;
begin
i:=l;
j:=r;
y:=a[(l+r)>>].w;
repeat
while a[i].w<y do
inc(i);
while a[j].w>y do
dec(j);
if i<=j then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r,a);
if j>l then sort(l,j,a);
end; procedure contraction(var tot:longint;var cnt:int64);
var
i,tmp,u,v:longint;
begin
tmp:=;
for i:= to tot do
begin
f[t[i].u]:=t[i].u;
f[t[i].v]:=t[i].v;
size[t[i].u]:=;
size[t[i].v]:=;
end;
sort(,tot,t);
for i:= to tot do
begin
u:=find(t[i].u);
v:=find(t[i].v);
if u=v then continue;
union(u,v);
inc(tmp);
tt[tmp]:=t[i];
end;
for i:= to tmp do
begin
f[tt[i].u]:=tt[i].u;
f[tt[i].v]:=tt[i].v;
size[tt[i].u]:=;
size[tt[i].v]:=;
end;
for i:= to tmp do
if tt[i].w<>-inf then
begin
u:=find(tt[i].u);
v:=find(tt[i].v);
if u=v then continue;
union(u,v);
inc(cnt,tt[i].w);
end;
tmp:=;
for i:= to tot do
if find(t[i].u)<>find(t[i].v) then
begin
inc(tmp);
tt[tmp]:=t[i];
pos[t[i].k]:=tmp;
tt[tmp].u:=f[t[i].u];
tt[tmp].v:=f[t[i].v];
end;
for i:= to tmp do
t[i]:=tt[i];
tot:=tmp;
end; procedure reduction(var tot:longint);
var
i,tmp,u,v:longint;
begin
tmp:=;
for i:= to tot do
begin
f[t[i].u]:=t[i].u;
f[t[i].v]:=t[i].v;
size[t[i].u]:=;
size[t[i].v]:=;
end;
sort(,tot,t);
for i:= to tot do
if (find(t[i].u)<>find(t[i].v)) or (t[i].w=inf) then
begin
union(f[t[i].u],f[t[i].v]);
inc(tmp);
tt[tmp]:=t[i];
end;
for i:= to tmp do
t[i]:=tt[i];
tot:=tmp;
end; procedure slove(dep,l,r:longint;cnt:int64);
var
i,mid:longint;
begin
if l=r then aa[qx[l]]:=qy[l];
for i:= to sum[dep] do
with e[dep][i] do
w:=aa[k];
for i:= to sum[dep] do
begin
t[i]:=e[dep][i];
pos[t[i].k]:=i;
end;
if l=r then
begin
ans[l]:=cnt;
for i:= to sum[dep] do
begin
f[t[i].u]:=t[i].u;
f[t[i].v]:=t[i].v;
size[t[i].u]:=;
size[t[i].v]:=;
end;
sort(,sum[dep],t);
for i:= to sum[dep] do
if find(t[i].u)<>find(t[i].v) then
begin
union(f[t[i].u],f[t[i].v]);
inc(ans[l],t[i].w);
end;
exit;
end;
sum[dep+]:=sum[dep];
for i:=l to r do
t[pos[qx[i]]].w:=-inf;
contraction(sum[dep+],cnt);
for i:=l to r do
t[pos[qx[i]]].w:=inf;
reduction(sum[dep+]);
for i:= to sum[dep+] do
e[dep+][i]:=t[i];
mid:=(l+r)>>;
slove(dep+,l,mid,cnt);
slove(dep+,mid+,r,cnt);
end; procedure init;
var
i:longint;
begin
read(n,m,q);
sum[]:=m;
for i:= to m do
with e[][i] do
begin
read(u,v,w);
k:=i;
aa[i]:=w;
end;
for i:= to q do
read(qx[i],qy[i]);
end; procedure work;
var
i:longint;
begin
slove(,,q,);
for i:= to q do
writeln(ans[i]);
end; begin
init;
work;
end.

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

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

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

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

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

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

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

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

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

  5. BZOJ2001: [Hnoi2010]City 城市建设

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至 ...

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

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

  7. [HNOI2010]CITY 城市建设

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

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

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

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

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

随机推荐

  1. ORACLE字符串分组聚合函数(字符串连接聚合函数)

    ORACLE字符串连接分组串聚函数 wmsys.wm_concat SQL代码: select grp, wmsys.wm_concat(str) grp, 'a1' str from dual un ...

  2. 和阿文一起学H5-文字云制作

    ---恢复内容开始--- 实用工具!优秀的标签云免费生成工具 来源:http://www.uisdc.com/online-word-cloud-generators 标签云或文字云是关键词的视觉化描 ...

  3. Java之绘制实例

    前面已经介绍过绘制方法. 弧形的绘制: package com.caiduping; import java.awt.Graphics; import javax.swing.JFrame; impo ...

  4. 返回页面,主页面不刷新window.history.go(-1),主页面刷新window.location.go(-1)

    返回上一页,不刷新 window.history.go(-1) 返回上一页,刷新 window.location.go(-1)

  5. Contoso 大学 - 7 – 处理并发

    原文 Contoso 大学 - 7 – 处理并发 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's W ...

  6. 第六篇、AVplayer定制视频播放控件

    1.引用头文件#import AVFoundation 2.自定义AVPlayer(播放的机器) 3.自定义AVPlayerItem(胶片) >> 视频的URL转成AVAsset 4.AV ...

  7. 如何获取Window

    [[UIApplication sharedApplication].delegate window]

  8. C# 线程--第三线程池

    概述 线程池有那些优点: 1.在多线程中线程池可以减少我们创建线程,并合理的复用线程池中的线程.因为在线程池中有线程的线程处于等待分配任务状态. 2.不必管理和维护生存周期短暂的线程,不用在创建时为其 ...

  9. (转)关于redis、memcache、mongoDB 的对比

    从以下几个维度,对redis.memcache.mongoDB 做了对比,欢迎拍砖 1.性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mo ...

  10. 119. Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...