tarjan、并查集、树状数组、树链剖分。

  时间倒流,变删边为加边。

  先求一波边双联通分量,缩点。

  题目保证最后还是整张图联通的。。所以就是一棵树。

  现在的操作就是,将路径上的边权置0(加边时),查询两点间边权和。

  可以转换成求根到点路径上边权和,置0的时候,就相当于将子树内的值都减去原边的长度,可以dfs序+树状数组。

  置0那个还要写个并查集,维护当前点经过连续一段0边到达的最远的祖先。

  查询的时候还得求lca。。。。就顺便写个链剖...

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ui unsigned int
using namespace std;
const int maxn=,maxm=;
struct zs{int too,pre;}e[maxm<<];int tot,last[maxn];
bool iscut[maxm<<];
struct zs1{int x,y;}a[maxm];
struct zs2{bool del;int id,x,y;}b[];
int fa[maxn],bel[maxn],dep[maxn],dfn[maxn],low[maxn],tim,L[maxn],R[maxn],TIM,sz[maxn],cha[maxn],id[maxn];
int la[maxn<<],pre[maxn<<],too[maxn<<],tt;
int An[];
int i,j,k,n,m,q,cnt;
bool gg[maxm]; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} inline int getbel(int x){return bel[x]!=x?bel[x]=getbel(bel[x]):x;} void dfs(int x,int efa){
dfn[x]=low[x]=++tim;
for(int i=last[x];i;i=e[i].pre)if(i!=efa)
if(!dfn[e[i].too])
dfs(e[i].too,i^),low[x]=min(low[x],low[e[i].too]);
else low[x]=min(low[x],dfn[e[i].too]);
if(dfn[x]==low[x]&&efa)iscut[efa]=iscut[efa^]=;
}
void dfs2(int x){
dep[x]=dep[fa[x]]+,sz[x]=;
for(int i=la[x];i;i=pre[i])
if(too[i]!=fa[x])fa[too[i]]=x,dfs2(too[i]),sz[x]+=sz[too[i]];
}
void dfs3(int x,int chain){
cha[x]=chain,L[x]=++TIM;
int i,mx=;
for(i=la[x];i;i=pre[i])if(too[i]!=fa[x]&&sz[too[i]]>sz[mx])mx=too[i];
if(!mx){R[x]=TIM;return;}
dfs3(mx,chain);
for(i=la[x];i;i=pre[i])if(too[i]!=fa[x]&&too[i]!=mx)dfs3(too[i],too[i]);
R[x]=TIM;
}
inline int getlca(int a,int b){
while(cha[a]!=cha[b]){
if(dep[cha[a]]<dep[cha[b]])swap(a,b);
a=fa[cha[a]];
}
return dep[a]<dep[b]?a:b;
}
inline void insert(int a,int b){
e[++tot].too=b,e[tot].pre=last[a],last[a]=tot,
e[++tot].too=a,e[tot].pre=last[b],last[b]=tot;
}
inline void ins(int a,int b){//printf(" %d-->%d\n",a,b);
too[++tt]=b,pre[tt]=la[a],la[a]=tt,
too[++tt]=a,pre[tt]=la[b],la[b]=tt;
}
int t[maxn];
inline void add(int l,int r,int v){//printf(" add: %d--%d v:%d\n",l,r,v);
while(l<=cnt)t[l]-=v,l+=l&-l;
r++;while(r<=cnt)t[r]+=v,r+=r&-r;
}
inline int ask(int x){/*printf("__x: %d\n",x);*/int sm=;while(x)sm+=t[x],x-=x&-x;return sm;} inline int query(int x,int y){
int lca=getlca(x,y);//printf("query: %d %d lca:%d %d %d\n",x,y,lca,getbel(x),getbel(y));
x=dep[x]+ask(L[x]),y=dep[y]+ask(L[y]),lca=dep[lca]+ask(L[lca]);//printf("dep: %d %d %d\n",x,y,lca);
return x+y-(lca<<);
}
inline void link(int x,int y){//printf("link:%d %d\n",x,y);
int i,j,tmp;
i=getbel(x),j=getbel(y);//printf(" %d %d dep:%d %d\n",i,j,dep[i],dep[j]);
while(i!=j){
if(dep[i]<dep[j])swap(i,j);
tmp=getbel(fa[i]);
add(L[i],R[i],/*dep[i]-dep[tmp]*/);//printf("i:%d tmp:%d\n",i,tmp);
bel[i]=tmp,i=bel[i];
}
} bool cmp(zs1 a,zs1 b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
inline int getpos(int x,int y){
int l=,r=m,mid;
while(l<r)
if(a[(mid=l+r>>)].x==x?(a[mid].y==y?gg[mid]:a[mid].y<y):a[mid].x<x)l=mid+;else r=mid;
return l;
}
int main(){
n=read(),m=read();register int i;
for(i=;i<=m;i++){
j=read(),k=read();
if(j>k)swap(j,k);
a[i].x=j,a[i].y=k;
}
sort(a+,a++m,cmp);
int id1;i=;
for(id1=read();id1!=-;id1=read()){
i++,j=b[i].x=read(),k=b[i].y=read();
if(j>k)swap(j,k);
if(!id1)b[i].del=,gg[b[i].id=getpos(j,k)]=;
}q=i; tot=;
for(i=;i<=m;i++)if(!gg[i])insert(a[i].x,a[i].y);
dfs(,);
for(i=;i<=n;i++)bel[i]=i;
for(i=;i<=tot;i+=)if(!iscut[i])
bel[getbel(e[i].too)]=getbel(e[i^].too);
for(i=;i<=n;i++)if(getbel(i)==i)id[i]=++cnt;
for(i=;i<=q;i++){
if(b[i].del)a[b[i].id].x=id[bel[a[b[i].id].x]],a[b[i].id].y=id[bel[a[b[i].id].y]];
b[i].x=id[getbel(b[i].x)],b[i].y=id[getbel(b[i].y)];
}
for(i=;i<=tot;i+=)if(iscut[i])ins(id[bel[e[i].too]],id[bel[e[i^].too]]);
for(i=;i<=cnt;i++)bel[i]=i;
fa[]=,dfs2(),dfs3(,);
// for(i=1;i<=cnt;i++)printf(" i:%d dfn:%d bel:%d L:%d R:%d dep:%d\n",i,L[i],cha[i],L[i],R[i],dep[i]); for(i=q;i;i--)//{
if(!b[i].del)An[i]=query(b[i].x,b[i].y);
else link(a[b[i].id].x,a[b[i].id].y);
// for(j=1;j<=n;j++)printf(" %d",ask(j));puts("");
// }
for(i=;i<=q;i++)if(!b[i].del)printf("%d\n",An[i]);
}

[bzoj1969] [Ahoi2005]LANE 航线规划的更多相关文章

  1. BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 587  Solved: 259[Submit][Status][Discuss] Description ...

  2. bzoj1969: [Ahoi2005]LANE 航线规划(树链剖分)

    只有删边,想到时间倒流. 倒着加边,因为保证图连通,所以一开始一定至少是一棵树.我们先建一棵树出来,对于每一条非树边,两个端点在树上这段路径的边就不会变成关键边了,所以将它们对答案的贡献删去,那么直接 ...

  3. bzoj1969 [Ahoi2005]LANE 航线规划 树链剖分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1969 题解 如果我们把整个图边双联通地缩点,那么最终会形成一棵树的样子. 那么在这棵树上,\( ...

  4. 【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树

    [BZOJ1969][Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由 ...

  5. BZOJ 1969: [Ahoi2005]LANE 航线规划( 树链剖分 )

    首先我们要时光倒流, 倒着做, 变成加边操作维护关键边. 先随意搞出一颗树, 树上每条边都是关键边(因为是树, 去掉就不连通了)....然后加边(u, v)时, 路径(u, v)上的所有边都变成非关键 ...

  6. 【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)

    1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星 ...

  7. [Ahoi2005]LANE 航线规划

    题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...

  8. 【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划

    Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel ...

  9. 【bzoj1959】[Ahoi2005]LANE 航线规划 树链剖分+线段树

    题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...

随机推荐

  1. UILabletext去掉乱码 控制颜色 行高 自定义大小 。显示不同的字体颜色、字体大小、行间距、首行缩进、下划线等属性(NSMutableAttributedString)

    text去掉乱码 设置不同颜色 行高 自定义大小 #import <Foundation/Foundation.h> @interface TextsForRow : NSObject @ ...

  2. 利用aop插入异常日志的2种方式

    AOP是面向切面编程,利用这个技术可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分的耦合性降低,提高代码的可重用性,同时提高开发效率(来自百度百科). Spring AOP有两种实现方式,一 ...

  3. JavaScript中的数组对象遍历、读写、排序等操作

    以百度前端技术学院的js任务三为例,复习一下关于js数组的几个点 题目 <!DOCTYPE> <html> <head> <meta charset=&quo ...

  4. 设计模式之 - 模板模式(Template Pattern)

    引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...

  5. 欢迎大家走进我的园子 ( ^___^ )y 本博客文章目录整理

    "记录"是见证成长:"成长"则意味着蜕变:“变",创造无限可能! ------致自己 文章越来越多,不容易查看,特整理了一个目录,方便快速查找 坚持的是分享,搬运的是知识,图的是大家的进步,欢迎更多的 ...

  6. 论文笔记-Squeeze-and-Excitation Networks

    作者提出为了增强网络的表达能力,现有的工作显示了加强空间编码的作用.在这篇论文里面,作者重点关注channel上的信息,提出了"Squeeze-and-Excitation"(SE ...

  7. 1.1 About Percona XtraDB Cluster

    摘要: 出处:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎 ...

  8. Android动画(一)-视图动画与帧动画

    项目中好久没用过动画了,所以关于动画的知识都忘光了.知识总是不用则忘.正好最近的版本要添加比较炫酷的动画效果,所以也借着这个机会,写博客来整理和总结关于动画的一些知识.也方便自己今后的查阅. Andr ...

  9. python打开一个本地目录文件路径

    os.path.abspath()os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能.主要用于操作本地目录文件.path.abspath()方法用于获取当前路径下的文件. 比 ...

  10. Python的类与类型

    1.经典类与新式类 在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style classes)有个简单的概念. 在Python 2.x及 ...