题面

这种不断删边的首先肯定想到时光倒流啊=。=

在最后剩下的连通图上跑出一棵搜索树,先将边权都赋为$1$,那么两点间的关键航线就是链上边权和,而每加入一条非树边$u,v$都会使得$u,v$链上的边的边权变为零。写个树剖,先把非树边加进去,然后逆着做一下就行了。

 #include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,Q=;
struct a
{
int n1,n2,t;
int mn(){return min(n1,n2);}
int mx(){return max(n1,n2);}
}edg[M],qry[Q];
bool operator < (a x,a y)
{
return x.mn()==y.mn()?x.mx()<y.mx():x.mn()<y.mn();
}
map<a,bool> mp;
int n,m,typ,tot,num,cnt;
int p[N],noww[*M],goal[*M];
int vis[N],outp[Q],val[*N],laz[*N];
int dfn[N],siz[N],anc[N],dep[N],imp[N],top[N];
void link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void DFS(int nde,int fth,int dth)
{
int tmp=;
siz[nde]=,vis[nde]=true;
anc[nde]=fth,dep[nde]=dth;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth&&!vis[goal[i]])
{
mp[(a){nde,goal[i],}]=true;
DFS(goal[i],nde,dth+);
siz[nde]+=siz[goal[i]];
if(siz[goal[i]]>tmp)
tmp=siz[goal[i]],imp[nde]=goal[i];
}
}
void mark(int nde,int tpp)
{
top[nde]=tpp,dfn[nde]=++num;
if(imp[nde])
{
mark(imp[nde],tpp);
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=imp[nde]&&goal[i]!=anc[nde])
mark(goal[i],goal[i]);
}
}
void create(int nde,int l,int r)
{
if(l==r)
val[nde]=,laz[nde]=-;
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
create(ls,l,mid),create(rs,mid+,r);
val[nde]=val[ls]+val[rs],laz[nde]=-;
}
}
void release(int nde,int l,int r)
{
if(~laz[nde])
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
laz[ls]=laz[nde],laz[rs]=laz[nde];
val[ls]=(mid-l+)*laz[nde];
val[rs]=(r-mid)*laz[nde];
laz[nde]=-;
}
}
void change(int nde,int l,int r,int nl,int nr,int task)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
val[nde]=task*(r-l+),laz[nde]=task;
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
change(ls,l,mid,nl,nr,task),change(rs,mid+,r,nl,nr,task);
val[nde]=val[ls]+val[rs];
}
}
int query(int nde,int l,int r,int nl,int nr)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
return val[nde];
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
return query(ls,l,mid,nl,nr)+query(rs,mid+,r,nl,nr);
}
}
int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y); x=anc[top[x]];
}
return dep[x]<dep[y]?x:y;
}
void path_change(int x,int y)
{
int lca=LCA(x,y),mem=query(,,n,dfn[lca],dfn[lca]);
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
change(,,n,dfn[top[x]],dfn[x],); x=anc[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
change(,,n,dfn[x],dfn[y],),change(,,n,dfn[lca],dfn[lca],mem);
}
int path_query(int x,int y)
{
int ret=;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret+=query(,,n,dfn[top[x]],dfn[x]); x=anc[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
int lca=LCA(x,y),dec=query(,,n,dfn[lca],dfn[lca]);
return ret+query(,,n,dfn[x],dfn[y])-dec;
}
int main ()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&edg[i].n1,&edg[i].n2);
mp[edg[i]]=true;
}
while(scanf("%d",&typ)&&~typ)
{
qry[++tot].t=typ;
scanf("%d%d",&qry[tot].n1,&qry[tot].n2);
if(!typ) mp[qry[tot]]=false;
}
for(int i=;i<=m;i++)
if(mp[edg[i]])
{
link(edg[i].n1,edg[i].n2);
link(edg[i].n2,edg[i].n1);
}
mp.clear(); DFS(,,);
memset(p,,sizeof p),cnt=;
for(int i=;i<=m;i++)
if(mp[edg[i]])
{
link(edg[i].n1,edg[i].n2);
link(edg[i].n2,edg[i].n1);
}
mark(,); create(,,n);
for(int i=;i<=tot;i++)
if(!qry[i].t) mp[qry[i]]=true;
for(int i=;i<=m;i++)
if(!mp[edg[i]]) path_change(edg[i].n1,edg[i].n2);
for(int i=tot;i;i--)
{
if(qry[i].t) outp[++outp[]]=path_query(qry[i].n1,qry[i].n2);
else path_change(qry[i].n1,qry[i].n2);
}
while(outp[]) printf("%d\n",outp[outp[]--]);
return ;
}

解题:AHOI 2005 航线规划的更多相关文章

  1. [AHOI 2005] 航线规划

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1969 [算法] 首先离线 , 将删边操作转化为加边操作 不妨首先将这张图按边-双连通 ...

  2. 洛谷 P2542 [AHOI2005]航线规划 解题报告

    P2542 [AHOI2005]航线规划 题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系 ...

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

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

  4. 【BZOJ1969】航线规划(Link-Cut Tree)

    [BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...

  5. 让大疆去做测绘---航线规划软件APP

    让大疆去做测绘---航线规划软件APP http://blog.zhulong.com/u10783270/blogdetail7162540.html RockyCapture无人机航线飞行控制软件 ...

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

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

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

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

  8. P2542 【[AHOI2005]航线规划】

    P2542 [[AHOI2005]航线规划] 一个无向图,m个操作 删去一条边 给定两个点,求有多少边使得如果这条边不存在,给定的两个点不连通 一般这种删边的题目,考虑逆序加边处理 在删完的图中,任意 ...

  9. [Ahoi2005]LANE 航线规划

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

随机推荐

  1. 牛客小白月赛9H论如何出一道水题(两个连续自然数互质)

    题面 记录一下...连续得两个自然数互质,这题再特判一下1的情况 #include<bits/stdc++.h> using namespace std; int main() { lon ...

  2. WPF获取窗口句柄

    通过WPF的互操作帮助类WindowInteropHelper,相关连接:https://msdn.microsoft.com/zh-cn/library/system.windows.interop ...

  3. 准备正式开始学习C++,先发点牢骚

    由于职业关系,经常使用AutoCAD之类绘图软件,但这些软件平台的功能,对专业的应用细节来说,并不能全都照顾到,需要一些二次开发,提升一些个性化操作的效率.软件本身也大多提供了开发软件包,AutoCA ...

  4. 性能测试工具——LoadRunner篇(一)

    一.LoadRunner组件 1.Virtual User Generato——r录制最终用户业务流程并创建性能 2.Controller——组织.驱动.管理并发监控负载测试 3.Analysis—— ...

  5. InTelliJ 字体调整

    Java IDE 工具InTelliJ 调整字体大小 1.File -> Settings 2.左上的搜索框中输入 font. 等待自动查找结果. 3.修改size 大小

  6. 高可用Kubernetes集群-1. 集群环境

    参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...

  7. Numpy入门笔记第二天

    # 数组的组合 import numpy as np arr1 = np.arange(5) arr2 = np.arange(3) print arr1 print arr2 [0 1 2 3 4] ...

  8. 十大经典排序算法总结 (Python)

    作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...

  9. Hyperledger_Fabric_Model

    Hyperledger_Fabric_Model 本部分描述了Hyperledger Fabric的主要设计特点 Assets: 资产定义使得任何东西都可以通过货币值在网络中交易,从食物到老爷车再到期 ...

  10. How to Manage Amazon-Fulfilled Orders - Cancel an Amazon-Fulfilled Order

    You may request to cancel customer orders that have a status of "Pending" or "Unshipp ...