解题:AHOI 2005 航线规划
这种不断删边的首先肯定想到时光倒流啊=。=
在最后剩下的连通图上跑出一棵搜索树,先将边权都赋为$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 航线规划的更多相关文章
- [AHOI 2005] 航线规划
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1969 [算法] 首先离线 , 将删边操作转化为加边操作 不妨首先将这张图按边-双连通 ...
- 洛谷 P2542 [AHOI2005]航线规划 解题报告
P2542 [AHOI2005]航线规划 题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系 ...
- BZOJ 1969: [Ahoi2005]LANE 航线规划( 树链剖分 )
首先我们要时光倒流, 倒着做, 变成加边操作维护关键边. 先随意搞出一颗树, 树上每条边都是关键边(因为是树, 去掉就不连通了)....然后加边(u, v)时, 路径(u, v)上的所有边都变成非关键 ...
- 【BZOJ1969】航线规划(Link-Cut Tree)
[BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...
- 让大疆去做测绘---航线规划软件APP
让大疆去做测绘---航线规划软件APP http://blog.zhulong.com/u10783270/blogdetail7162540.html RockyCapture无人机航线飞行控制软件 ...
- 【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)
1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星 ...
- 【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树
[BZOJ1969][Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由 ...
- P2542 【[AHOI2005]航线规划】
P2542 [[AHOI2005]航线规划] 一个无向图,m个操作 删去一条边 给定两个点,求有多少边使得如果这条边不存在,给定的两个点不连通 一般这种删边的题目,考虑逆序加边处理 在删完的图中,任意 ...
- [Ahoi2005]LANE 航线规划
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
随机推荐
- selenium自动化之定位多个元素
前面我们讲的都是如何定位单个元素,下面讲下怎么去定位多个元素,并且输出文本. 以百度为例:获取标红的这一组元素的文本 这里我用到的是xpath来定位的://div[@id="u1" ...
- 第四篇 Postman之Pre-request Script(前置处理器:JS之 YYYY-MM-DD HH:MM:SS)
本篇来讲讲Pre-request Script 前置处理器,定义在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量. 本例子也是项目中遇到的,需要修改与客户的预约时间,但 ...
- Egret入门(三)--创建HelloWorld项目(4.0-使用Egret Wing)
准备 编辑器: Egret Wing3(4.0.3) 需要下载安装 语言: TepyScript(JS的超集,参考手册http://bbs.egret.com/thread-1441-1-1.html ...
- thinkphp5登录并保存session、根据不同用户权限跳转不同页面
本文讲述如何在thinkphp5中完成登录并保存session.然后根据不同的用户权限跳转相应页面功能的实现.我也在学习thinkphp源码的路上,记录一下并与大家分享.完成该步骤主要有以下三个步骤完 ...
- dotnet服务器端框架从精通到弃坑
当你们看到这篇经验分享的时候,我已经把服务器端主要力量转到JAVA了. 纯当留念. 另外里面实现oauth2.0的部分就不写了,因为特殊性太强,完全根据自家需求结合它的理念改写的. 为什么我会选择sp ...
- Kafka安装之二 在CentOS 7上安装Kafka
一.简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这 ...
- 数据时代的的企业管理 记SAP商业同略会
[PConline 资讯]在2012 SAP中国商业同略会城市论坛深圳站上,自SAP中国的萧洁云总裁和张志琦先生,对SAP中国的战略.SAP的技术战略,以及SAP对于行业趋势分析与媒体进行了沟通,对数 ...
- 第二次ScrumMeeting博客
第二次ScrumMeeting博客 本次会议于10月26日(四)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.方科栋.辛德泰.窦鑫泽.张安澜. 1. 每个人的工作(有Issue的内容 ...
- centos上搭建git服务--2
在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.window ...
- react native中state和ref的使用
react native中state和ref的使用 因props是只读的,页面中需要交互的情况我们就需要用到state. 一.如何使用state 1:初始化state 第一种方式: construct ...