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. jquery里的宽度详解

    在jQuery中,width()方法用于获得元素宽度:innerWidth()方法用于获得包括内边界(padding)的元素宽度,outerWidth()方法用于获得包括内边界(padding)和边框 ...

  2. http协议的总结说明

    关于http协议已经有很多大牛们的讨论,从他们的文章中获益匪浅,作为一个通信专业的学生,还是想从计算机网络的角度谈一下自己的认识.http协议全称超文本传输协议,是一种允许将超文本标记语言(HTML) ...

  3. Linux 命令 - uniq: 通知或忽略重复行

    给定一个已排好序的文件,uniq 会删除重复行并将结果输出到标准输出中.uniq 通常与 sort 结合使用以删除 sort 输出内容中的重复行. 命令格式 uniq [OPTION]... [INP ...

  4. kafka集群安装与配置

    一.集群安装 1. Kafka下载: 可以从kafka官方网站(http://kafka.apache.org)上找到下载地址,再wgetwget http://mirrors.cnnic.cn/ap ...

  5. Sublime Text 3下 Emmet 使用小技巧

    Emmet常用技巧:(输入下面简写,按Tab键可触发效果)                          生成 HTML 文档初始结构 html:5 或者 ! 生成 HTML5 结构        ...

  6. IOS 解析XML--使用NSXML

    一.解析文档顺序触发的函数 1.parserDidStartDocument,在文档的时候触发. 2.parser:didStartElement:namespaceURI:qualifiedName ...

  7. SEO前端优化

    精减代码 清除网页中一些冗余的代码,网上有这样的工具,可以辅助完成,如果需要的话,我们可以把代码中的注释去掉,甚至空行之类的也去掉,尽量的减少代码量,从而减小页面体积. CSS Sprites 通俗点 ...

  8. listView异步处理图片下载缓存

    package cn.wangmeng.test; import java.io.File;import java.io.FileOutputStream;import java.io.IOExcep ...

  9. 淘宝IP地址库API接口(PHP)通过ip获取地址信息

    淘宝IP地址库网址:http://ip.taobao.com/ 提供的服务包括: 1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 2. 用 ...

  10. 【Java Web】Eclipse中配置Marven环境

    1  Marven简介 Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信 ...