bzoj 2238 Mst——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2238
一条非树边可以对一条链的树边产生影响。注意是边,所以把边下放到点上,只要跳 top 时不赋 lca 就行。
然后WA*3。看看题解才知道有一开始图就不连通的情况!自己还是太嫩了……
只有单点查询很方便用标记永久化。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e4+,M=1e5+;
int n,m,q,hd[N],xnt,to[N<<],nxt[N<<],fa[N],ans;
int tim,dfn[N],siz[N],dep[N],son[N],top[N];
int tot,ls[N<<],rs[N<<],mn[N<<];
bool used[M],flag;
struct Ed{
int x,y,w,bh;
Ed(int a=,int b=,int c=,int d=):x(a),y(b),w(c),bh(d) {}
bool operator< (const Ed &b)const
{return w<b.w;}
}ed[M];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
bool cmp(Ed u,Ed v){return u.bh<v.bh;}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
void add(int x,int y)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;
to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;
}
void dfs(int cr)
{
dep[cr]=dep[fa[cr]]+; siz[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa[cr])
{
fa[v]=cr; dfs(v); siz[cr]+=siz[v];
siz[v]>siz[son[cr]]?son[cr]=v:;
}
}
void dfsx(int cr)
{
dfn[cr]=++tim;
if(son[cr])top[son[cr]]=top[cr],dfsx(son[cr]);
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa[cr]&&v!=son[cr])
top[v]=v,dfsx(v);
}
void build(int l,int r,int cr)
{
mn[cr]=M; if(l==r)return;
int mid=l+r>>;
ls[cr]=++tot; build(l,mid,ls[cr]);
rs[cr]=++tot; build(mid+,r,rs[cr]);
}
void mdfy(int l,int r,int cr,int L,int R,int k)
{
if(l>=L&&r<=R){mn[cr]=min(mn[cr],k);return;}
int mid=l+r>>;
if(L<=mid)mdfy(l,mid,ls[cr],L,R,k);
if(mid<R)mdfy(mid+,r,rs[cr],L,R,k);
}
void mdfy(int x,int y,int w)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
mdfy(,n,,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if(x==y)return;//
if(dep[x]<dep[y])swap(x,y);
mdfy(,n,,dfn[son[y]],dfn[x],w);//son for no lca
}
int query(int l,int r,int cr,int p)
{
if(l==r)return mn[cr];
int mid=l+r>>;
if(p<=mid)return min(query(l,mid,ls[cr],p),mn[cr]);
else return min(query(mid+,r,rs[cr],p),mn[cr]);
}
int main()
{
n=rdn();m=rdn();
for(int i=,u,v,z;i<=m;i++)
{
u=rdn(); v=rdn(); z=rdn();
ed[i]=Ed(u,v,z,i);
}
for(int i=;i<=n;i++)fa[i]=i;
sort(ed+,ed+m+);
for(int i=,u,v;i<=m;i++)
if((u=find(ed[i].x))!=(v=find(ed[i].y)))
{
used[ed[i].bh]=; fa[u]=v;
add(ed[i].x,ed[i].y); ans+=ed[i].w;
}
int d=find();
for(int i=;i<=n;i++)if(find(i)!=d){flag=;break;}
if(!flag)
{
sort(ed+,ed+m+,cmp);
fa[]=; dfs(); top[]=; dfsx(); tot=; build(,n,);
for(int i=;i<=m;i++)
if(!used[i]) mdfy(ed[i].x,ed[i].y,ed[i].w);
}
q=rdn();
for(int i=,d;i<=q;i++)
{
d=rdn();
if(flag){puts("Not connected");continue;}
if(!used[d])printf("%d\n",ans);
else
{
int k=query(,n,,max(dfn[ed[d].x],dfn[ed[d].y]));//ed[d]!
if(k==M)puts("Not connected");
else printf("%d\n",ans-ed[d].w+k);//ed[d]!
}
}
return ;
}
bzoj 2238 Mst——树链剖分的更多相关文章
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...
- BZOJ 3083 遥远的国度 树链剖分
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 797 Solved: 181[Submit][Status] Descrip ...
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- BZOJ 3083: 遥远的国度(树链剖分+DFS序)
可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...
- BZOJ 2157 旅行(树链剖分码农题)
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...
- BZOJ 3083 遥远的国度(树链剖分+LCA)
Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...
- BZOJ 3083 遥远的国度 树链剖分+线段树
有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...
- BZOJ 2243 染色 树链剖分
题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连 ...
随机推荐
- run kubernetes
use kubeadm in lab only,,, do not use it in production install docker 1.12.6 -.. please noted ...
- Nginx(一):安装
nginx 的安装 下载地址: http://nginx.org/download/nginx-1.4.2.tar.gz 安装准备: nginx依赖于pcre库,要先安装pcre(正则的库) yum ...
- asp.net MVC通用分页组件 使用方便 通用性强
asp.net MVC通用分页组件 使用方便 通用性强 该分页控件的显示逻辑: 1 当前页面反色突出显示,链接不可点击 2 第一页时首页链接不可点击 3 最后一页时尾页链接不可点击 4 当前页面左 ...
- <LeetCode OJ> 337. House Robber III
Total Accepted: 1341 Total Submissions: 3744 Difficulty: Medium The thief has found himself a new pl ...
- 【Sprint2 每日Scrum】 第一天(4.22)Sprint2计划会议成果
Sprint2计划会议成果 从今天起我们就开始正式的Sprint2之旅了,经过上一次Sprint1的冲刺计划和几天的调整,我们已经大致了解了敏捷开发的流程和思想,并将我们的TD学生助手做出了大致的框架 ...
- unittest相关文档
文档链接: http://blog.csdn.net/wangst4321/article/details/8454118
- Linux随笔记
Linux配置apt-get源地址 以Ubuntu配置网易开源镜像站为例: 访问地址:http://mirrors.163.com/,找到对应的系统. 先将source.list进行备份,执行: su ...
- C++中字符数组和字符串string
字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1) 数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...
- Oracle中,将毫秒数转换为timestamp类型的两种方法
在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以NUMBER类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要 把这 ...
- EasyDarwin开源社区流媒体视频课程:流媒体传输控制协议(RTSP RTP SDP)详解之sdp
视频课程及相关文档代码地址:https://github.com/EasyDarwin/Course#course-3 SDP协议 一.SDP协议介绍 SDP 完全是一种会话描述格式(对应的RFC23 ...