【BZOJ2001】 [Hnoi2010]City 城市建设
BZOJ2001 [Hnoi2010]City 城市建设
Solution
我们考虑一下这个东西怎么求解?
思考无果......
咦?
好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除,然后不确定的保留,必须选的就去确定连通性.
然后可以了?
好妙啊.cdq果然还是万金油.
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=100010,Inf=1e9+10;
struct node{
int u,v,w,id;
bool operator<(const node b)const{
return w<b.w;
}
}E[N],e[60][N],tmp[N],st[N];
int f[N],c[N],siz[50],W[N];
ll ans[N];
struct ques{
int w,x;
}q[N];
int find(int x){
if(x!=f[x])f[x]=find(f[x]);
return f[x];
}
void init(int z){
for(int i=1;i<=z;i++)f[tmp[i].u]=tmp[i].u;
for(int i=1;i<=z;i++)f[tmp[i].v]=tmp[i].v;
}
void Solve1(int &z,ll &Ans){
init(z);sort(tmp+1,tmp+z+1);int top=0;
for(int i=1;i<=z;i++)
if(find(tmp[i].u)!=find(tmp[i].v)){
f[find(tmp[i].u)]=find(tmp[i].v);
st[++top]=tmp[i];
}
for(int i=1;i<=top;i++)f[st[i].u]=st[i].u,f[st[i].v]=st[i].v;
for(int i=1;i<=top;i++)
if(st[i].w>-Inf){
f[find(st[i].u)]=find(st[i].v);
Ans+=st[i].w;
}
top=0;
for(int i=1;i<=z;i++)
if(find(tmp[i].u)!=find(tmp[i].v)){
st[++top]=tmp[i];
c[tmp[i].id]=top;
st[top].u=find(tmp[i].u);
st[top].v=find(tmp[i].v);
}
z=top;for(int i=1;i<=top;i++)tmp[i]=st[i];
}
void Solve2(int &z)
{
init(z);sort(&tmp[1],&tmp[z+1]);int top=0;
for(int i=1;i<=z;++i)
if(find(tmp[i].u)!=find(tmp[i].v))
f[find(tmp[i].u)]=find(tmp[i].v),st[++top]=tmp[i],c[tmp[i].id]=top;
else if(tmp[i].w>=Inf)st[++top]=tmp[i],c[tmp[i].id]=top;
z=top;for(int i=1;i<=top;++i)tmp[i]=st[i];
}
void cdq(int l,int r,int dep,ll Ans){
if(l==r)W[q[l].x]=q[l].w;
int z=siz[dep],mid=(l+r)>>1;
for(int i=1;i<=z;i++)e[dep][i].w=W[e[dep][i].id];
for(int i=1;i<=z;i++)tmp[i]=e[dep][i],c[tmp[i].id]=i;
if(l==r){
init(z);sort(tmp+1,tmp+z+1);
for(int i=1;i<=z;i++)
if(find(tmp[i].u)!=find(tmp[i].v)){
f[find(tmp[i].u)]=find(tmp[i].v);Ans+=tmp[i].w;
}
ans[l]=Ans;return;
}
for(int i=l;i<=r;i++)tmp[c[q[i].x]].w=-Inf;
Solve1(z,Ans);
for(int i=l;i<=r;i++)tmp[c[q[i].x]].w=+Inf;
Solve2(z);
for(int i=1;i<=z;i++)e[dep+1][i]=tmp[i];siz[dep+1]=z;
cdq(l,mid,dep+1,Ans);cdq(mid+1,r,dep+1,Ans);
}
int main()
{
int n,m,Q;
n=gi();m=gi();Q=gi();
for(int i=1;i<=m;i++)E[i].u=gi(),E[i].v=gi(),E[i].w=gi(),E[i].id=i;
for(int i=1;i<=Q;i++)q[i].x=gi(),q[i].w=gi();
for(int i=1;i<=m;i++)W[i]=E[i].w;
for(int i=1;i<=m;i++)e[0][i]=E[i];
siz[0]=m;cdq(1,Q,0,0);
for(int i=1;i<=Q;i++)printf("%lld\n",ans[i]);
return 0;
}
【BZOJ2001】 [Hnoi2010]City 城市建设的更多相关文章
- BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Lou ...
- BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】
题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上 ...
- BZOJ2001: [Hnoi2010]City 城市建设
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至 ...
- BZOJ 2001: [Hnoi2010]City 城市建设
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 555[Submit][ ...
- 【bzoj2001】 Hnoi2010—City 城市建设
http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...
- 2001: [Hnoi2010]City 城市建设 - BZOJ
DescriptionPS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的 ...
- 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设
Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少 ...
- [HNOI2010]CITY 城市建设
问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面 ...
- 【HNOI2010】城市建设(对时间分治 & Kruskal)
Description \(n\) 个点 \(m\) 条边的带边权无向图.\(q\) 次操作,每次修改一条边的权值. 求每次修改后的最小生成树的边权和. Hint \(1\le n\le 2\time ...
随机推荐
- Spring Boot学习笔记:JavaMailSender发送邮件
项目中经常会有这样的需求,用户注册成功,需要给用户发送一封邮件.邮件需要有一定格式和样式.本次例子中用freemarker做样式,其他的模版引擎类似. 首先Spring Boot项目,项目结构如下 在 ...
- 【Linux】ODBC安装
ODBC介绍 ODBC是Open Database Connect 即开发数据库互连的简称,它是一个用于访问数据库的统一界面标准.ODBC引入一个公共接口以解决不同数据库潜在的不一致性,从而很好的保证 ...
- 用EventLog Analyzer的预定义报表和告警来进行Syslog管理
用EventLog Analyzer的预定义报表和告警来进行Syslog管理 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能 ...
- 58.UIScrollView XIB拖拽约束
第一步: 拖拽UIScrollView 到控制器上 ,给scrollView 添加约束 ,这时是正常的 第二步:scrollview上添加UIview ,(注意:这个 ScrollView就是根据这个 ...
- 2019.01.02 NOIP训练 三七二十一(生成函数)
传送门 生成函数基础题. 题意简述:求由1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数都要是偶数. 考虑对于每个数字构造生成函数. 对于1,5,9:∑nxnn!=ex\sum_ ...
- Firefox table 不居中解决办法 解决火狐层或 table 不居中
Firefox table 不居中解决办法: table 使用 align="center" ,IE正常,Firefox 却是居左了,网上有各种解决的办法,比如在table外面再套 ...
- hdu-1394(线段树&逆序数的性质和求法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目大意: 给出一个序列,一对逆序数就是满足i<j&&a[i]>a[ ...
- Cannot read property 'protocol' of undefined的原因和解决办法
Cannot read property 'protocol' of undefined 原因:axios请求中的错误 1.请求地址写错了 2.没有引入http.js 3.引入http.js的时候,单 ...
- hdu6444 2018中国大学生程序设计竞赛 - 网络选拔赛 1007 Neko's loop
Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S ...
- boost-容器
1.array array相当于是一个增加了STL容器接口的数组,但它不像vector等容器一样可以动态增长,如果需要动态变动array的容量可以使用boost::scoped_array.array ...