题目: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——树链剖分的更多相关文章

  1. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  2. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  3. BZOJ 3083 遥远的国度 树链剖分

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 797  Solved: 181[Submit][Status] Descrip ...

  4. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  5. BZOJ 3083: 遥远的国度(树链剖分+DFS序)

    可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...

  6. BZOJ 2157 旅行(树链剖分码农题)

    写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...

  7. BZOJ 3083 遥远的国度(树链剖分+LCA)

    Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...

  8. BZOJ 3083 遥远的国度 树链剖分+线段树

    有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...

  9. BZOJ 2243 染色 树链剖分

    题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连 ...

随机推荐

  1. TDDL-剖析淘宝TDDL

    TDDL-剖析淘宝TDDL 学习了:https://blog.csdn.net/sumj7011/article/details/78286741 Taobao Distribute Data Lay ...

  2. phpcms v9中 action=&quot;position&quot; 和action=&quot;lists&quot;有什么差别, 以及action 的属性和值

    action值的含义: lists 内容数据(文章?)列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 position 内容推荐位列表

  3. 改变其他iframe的src

    window.parent.$("#ifr").location="????";);来改变

  4. MySQL的timeout那点事

    http://www.mysqlops.com/2011/11/24/mysql_timeout.html

  5. windows下redis安装以及简单配置

    1.下载redis 下载地址https://github.com/dmajkic/redis/downloads.有32bit和64bit根据自己需要选择就可以了. 2.安装redis 首先使用cmd ...

  6. ffmpeg 视频教程 添加水印附源码

    本文主要讲述如何利用Ffmpeg向视频文件 添加水印这一功能,文中最后会给出源代码下载地址以及视频 下载地址,视频除了讲述添加水印的基本原理以及代码实现,还提到了要注意的一些地方,因为直接运行 dem ...

  7. GIS+=地理信息+行业+大数据——纽约公开11亿条出租车和Uber原始数据下载及分析

    一览众山小编辑团队 原文/ Todd Schneider 翻译/ 沈玮薇 陈翚 文献/ 蒋理 校核/ 众山小编辑/ 众山小 排版/ 徐颖 2014-2015 © 转载请注明:源自公众号"一览 ...

  8. kubernetes调度之资源配额

    系列目录 当多个用户或者开发团队共享一个有固定节点的的kubernetes集群时,一个团队或者一个用户使用的资源超过他应当使用的资源是需要关注的问题,资源配额是管理员用来解决这个问题的一个工具. 资源 ...

  9. asyncio协程与并发

    并发编程 Python的并发实现有三种方法. 多线程 多进程 协程(生成器) 基本概念 串行:同时只能执行单个任务 并行:同时执行多个任务 在Python中,虽然严格说来多线程与协程都是串行的,但其效 ...

  10. LeetCode(83)题解: Remove Duplicates from Sorted List

    https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 题目: Given a sorted linked list, de ...