BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树
Description
Input
Output
Sample Input
1 2 3
1 3 5
2 3 9
2 4 1
4
1
2
3
4
Sample Output
15
13
9
Not connected
我们先求任意一棵最小生成树。
如果被删除的边(x->y)不在树上,则直接输出最小生成树的边权和即可。
否则我们要找到所有能使x,y两点连通的边中边权最小的那个,把它换上。
在插入每条非树边时用这条边的权值更新树上x->y路径上权值的最小值,同时记录边权最小的边的编号。
然后这个可以用树剖+线段树维护出来。
注意如果图不联通要输出Not connected,
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ls p<<1
#define rs p<<1|1
#define N 100050
int head[N],to[N<<1],nxt[N<<1],cnt,n,m;
int mn[N<<2],f[N],sum,ref[N],val[N<<1];
int dep[N],fa[N],top[N],siz[N],son[N],idx[N],tot;
struct A {
int x,y,z,flg,id;
}a[N];
bool cmp1(const A &x,const A &y) {return x.z<y.z;}
bool cmp2(const A &x,const A &y) {return x.id<y.id;}
int find(int x) {
return f[x]==x?x:f[x]=find(f[x]);
}
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
void dfs1(int x,int y) {
int i;
dep[x]=dep[y]+1; fa[x]=y; siz[x]=1;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y) {
ref[val[i]]=to[i];
dfs1(to[i],x); siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
}
}
void dfs2(int x,int t) {
top[x]=t;idx[x]=++tot;
if(son[x]) dfs2(son[x],t);
int i;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=fa[x]&&to[i]!=son[x]) {
dfs2(to[i],to[i]);
}
}
}
void update(int l,int r,int x,int y,int v,int p) {
if(x<=l&&y>=r) {
mn[p]=min(mn[p],v); return ;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,v,ls);
if(y>mid) update(mid+1,r,x,y,v,rs);
}
int query(int l,int r,int x,int p) {
if(l==r) return mn[p];
int mid=(l+r)>>1;
if(x<=mid) return min(mn[p],query(l,mid,x,ls));
else return min(mn[p],query(mid+1,r,x,rs));
}
int main() {
scanf("%d%d",&n,&m);
int i,ne=0,x,y;
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z),a[i].id=i;
sort(a+1,a+m+1,cmp1);
for(i=1;i<=m;i++) {
int dx=find(a[i].x),dy=find(a[i].y);
if(dx!=dy) {
add(a[i].x,a[i].y,a[i].id);
add(a[i].y,a[i].x,a[i].id);
ne++;
f[dx]=dy;
a[i].flg=1;
sum+=a[i].z;
if(ne==n-1) break;
}
}
int q;
if(ne<n-1) {
scanf("%d",&q);
while(q--) {
puts("Not connected");
}
return 0;
}
dfs1(1,0); dfs2(1,1);
for(i=1;i<=4*n;i++) mn[i]=1<<30;
sort(a+1,a+m+1,cmp2);
for(i=1;i<=m;i++) {
if(!a[i].flg) {
x=a[i].x,y=a[i].y;
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) swap(x,y);
update(1,n,idx[top[y]],idx[y],a[i].z,1);
y=fa[top[y]];
}
if(dep[x]<dep[y]) swap(x,y);
if(x!=y)update(1,n,idx[y]+1,idx[x],a[i].z,1);
}
}
int k;
scanf("%d",&q);
while(q--) {
scanf("%d",&k);
if(!a[k].flg) {
printf("%d\n",sum);
}else {
x=a[k].x;y=a[k].y;
int re=query(1,n,idx[ref[k]],1);
if(re==(1<<30)) {
puts("Not connected");
}else {
printf("%d\n",sum-a[k].z+re);
}
}
}
}
BZOJ_2238_Mst_树剖+线段树的更多相关文章
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
- BZOJ_2157_旅游_树剖+线段树
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...
- 【BZOJ5210】最大连通子块和 树剖线段树+动态DP
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...
- [LNOI2014]LCA(树剖+线段树)
\(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...
- [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...
- 【bzoj4699】树上的最短路(树剖+线段树优化建图)
题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...
- POJ3237 Tree(树剖+线段树+lazy标记)
You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...
随机推荐
- javascript学习(二)javascript常见问题总结
在js使用过程中,经常会碰到一些问题,本人利用闲暇时间整理了一些常见问题的解决方法,贴出来和大家分享,有需要的朋友可以参考下 1.JS中方法和变量都是区分大小写的 2.单引号.双引号在JS中没有特殊 ...
- 前端CDN公共库整理
转自: 灰狼博客, 地址: http://itlobo.com/articles/2016.html 现在web应用都在使用js类库,这些类库小的几十K,大的几百K,而国内网络访问速度大家都知道不是那 ...
- python中元组、列表、字典、集合知识
像列表一样处理字符串: 仅需要看字符串的首字符就知道如何处理该字符串的情况也很常见.例如,如果有一个姓与名的列表,您可以使用与列表相同的语法查看名与姓的第一个字符.这种看待字符串的方法叫做分片(sli ...
- PHP采用Cookie实现 购物车
先来看一下逻辑分析图:
- Oracle VM VirtualBox(一) 快速拷贝一个新的虚拟机
快速拷贝一个新的虚拟机 一 找到虚拟机vdi文件,复制一份并重命名. 二 修改新虚拟机的UUID 注:不修改创建不了虚拟机,会抛出Oracle VM VirtualBox UUID already e ...
- Windows10 Ubuntu bash 配置 LAMP+JDK+Tomcat
Windows10的Bash省去了装ubuntu虚拟机的麻烦,而且可以直接用Windows下的浏览器去访问了,Exciting有没有,再也不用去忍受日常崩溃的chromium和慢慢的firefox了. ...
- CSS学习笔记三:自定义单选框,复选框,开关
一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...
- 微信小程序-统一下单、微信支付(Java后台)
1.首先分享 微信统一下单接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 微信接口 签名 对比网址: https: ...
- netty的编解码器理解(转)
一.简介 在网络应用中需要实现某种编解码器,将原始字节数据与自定义的消息对象进行互相转换.网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码. 编解码器由 ...
- 十九、Hadoop学记笔记————Hbase和MapReduce
概要: hadoop和hbase导入环境变量: 要运行Hbase中自带的MapReduce程序,需要运行如下指令,可在官网中找到: 如果遇到如下问题,则说明Hadoop的MapReduce没有权限访问 ...