P2542 【[AHOI2005]航线规划】

一个无向图,m个操作

  • 删去一条边
  • 给定两个点,求有多少边使得如果这条边不存在,给定的两个点不连通

一般这种删边的题目,考虑逆序加边处理

在删完的图中,任意找出一棵生成树,对它进行树链剖分

然后需要把不再这颗生成树中但实际上没被删去的边加回来,当边\((u,v)\)被加回时,\((u,v)\)原本在生成树上的路径就都不是关键航线了(因为\((u,v)\)间已经有了至少两条道路能走)

在加每次操作中涉及的边也是一样

在最初那棵生成树中,每两个点的路径都是唯一的所以每条边都是关键航线,因此在建树时每个点权值赋为1,当它因为有的边被加会而不再关键时就设为0,用线段树维护就行

然后愉快0分

我在求生成树的时候,是和树剖的第一遍dfs一起进行的,但没有单独开vis数组,判断是否访问的时候直接判断if(fa[v]),但1号点(根)的父亲为0,所以就愉快TLE+MLE

改完以后发现10分

忘记pushup这种事肯定不能说出来。。

代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<map>
#define R register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,m;
std::map<int,int>map;
int etot=1,to[200006],nex[200006],fir[30006];
int deleted[200006],ontree[200006];
int fa[30006],deep[30006],size[30006];
int top[30006],dfn[30006],dfscnt,son[30006];
struct tr{
tr *ls,*rs;
int tag,sum;
}dizhi[60007],*root=&dizhi[0];
int tot;
int qc[100006],qx[100006],qy[100006],qtot;
int ans[100006],anstot;
inline void swap(int &x,int &y){x^=y;y^=x;x^=y;}
inline void add(int u,int v){
to[++etot]=v;
nex[etot]=fir[u];fir[u]=etot;
map[u*(n+1)+v]=etot;
}
void dfs1(int u,int fat){
fa[u]=fat;deep[u]=deep[fat]+1;size[u]=1;
for(R int v,i=fir[u];i;i=nex[i])if(!deleted[i]){
v=to[i];
if(fa[v]||v==1) continue;
ontree[i]=1;
dfs1(v,u);size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
}
void dfs2(int u,int topnow){
top[u]=topnow;dfn[u]=++dfscnt;
if(!son[u]) return;
dfs2(son[u],topnow);
for(R int v,i=fir[u];i;i=nex[i])if(ontree[i]){
v=to[i];
if(!dfn[v]) dfs2(v,v);
}
}
void build(tr *tree,int l,int r){
if(l==r) return tree->sum=1,void();
int mid=(l+r)>>1;
tree->ls=&dizhi[++tot];tree->rs=&dizhi[++tot];
build(tree->ls,l,mid);build(tree->rs,mid+1,r);
tree->sum=r-l+1;
}
inline void pushdown(tr *tree){
if(tree->tag){
tree->ls->tag=tree->rs->tag=1;
tree->ls->sum=tree->rs->sum=0;
tree->tag=0;
}
}
void change(tr *tree,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tree->tag=1,tree->sum=0,void();
int mid=(l+r)>>1;
pushdown(tree);
if(ql<=mid) change(tree->ls,l,mid,ql,qr);
if(qr>mid) change(tree->rs,mid+1,r,ql,qr);
tree->sum=tree->ls->sum+tree->rs->sum;
}
int qsum(tr *tree,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tree->sum;
int mid=(l+r)>>1,ret=0;
pushdown(tree);
if(ql<=mid) ret=qsum(tree->ls,l,mid,ql,qr);
if(qr>mid) ret+=qsum(tree->rs,mid+1,r,ql,qr);
return ret;
}
inline void updata(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
change(root,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
if(dfn[x]!=dfn[y]) change(root,1,n,dfn[x]+1,dfn[y]);
}
inline int sum(int x,int y){
R int ret=0;
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
ret+=qsum(root,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
if(dfn[x]!=dfn[y]) ret+=qsum(root,1,n,dfn[x]+1,dfn[y]);
return ret;
}
int main(){
n=read();m=read();
for(R int x,y,i=1;i<=m;i++){
x=read();y=read();
add(x,y);add(y,x);
}
R int x,y,cc,c=read();while(c!=-1){
x=read();y=read();
qc[++qtot]=c;qx[qtot]=x;qy[qtot]=y;
cc=map[x*(n+1)+y];
if(!c) deleted[cc]=deleted[cc^1]=1;
c=read();
}
dfs1(1,0);dfs2(1,1);
build(root,1,n);
for(R int i=1;i<=n;i++){
for(R int j=fir[i];j;j=nex[j])
if(!ontree[j]&&!ontree[j^1]&&!deleted[j]) updata(i,to[j]);
}
for(R int i=qtot;i;i--){
if(qc[i]) ans[++anstot]=sum(qx[i],qy[i]);
else updata(qx[i],qy[i]);
}
for(R int i=anstot;i;i--) std::printf("%d\n",ans[i]);
return 0;
}

P2542 【[AHOI2005]航线规划】的更多相关文章

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

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

  2. P2542 [AHOI2005]航线规划 LCT维护双连通分量

    \(\color{#0066ff}{ 题目描述 }\) 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel ...

  3. 洛谷P2542 [AHOI2005]航线规划(LCT,双连通分量,并查集)

    洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一 ...

  4. 洛谷 P2542 [AHOI2005]航线规划(Link-cut-tree)

    题面 洛谷 bzoj 题解 离线处理+LCT 有点像星球大战 我们可以倒着做,断边变成连边 我们可以把边变成一个点 连边时,如果两个点本身不联通,就\(val\)赋为\(1\),并连接这条边 如果,两 ...

  5. 洛谷 P2542 [AHOI2005]航线规划 树链剖分_线段树_时光倒流_离线

    Code: #include <map> #include <cstdio> #include <algorithm> #include <cstring&g ...

  6. [AHOI2005] 航线规划

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

  7. AHOI2005航线规划 bzoj1969(LCT缩点)

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

  8. 【[AHOI2005]航线规划】

    树剖维护边双 首先我们看到在整个过程中图是保证连通的,于是我们并不需要LCT来维护连通性 而这些询问询问的是两个点之间关键路径的数量,也就是无论怎么走都必须走的数量,显然这就是两点之间的割边的数量 由 ...

  9. [AHOI2005]航线规划——LCT维护边双联通分量

    因为只能支持加入一个边维护边双,所以时光倒流 维护好边双,每次就是提取出(x,y)的链,答案就是链长度-1 具体维护边双的话, void access(int x){ for(reg y=0;x;y= ...

随机推荐

  1. docker开机自动启动

    方法一: chkconfig docker on 方法二: 1.1是用systemctl: systemctl enable docker 1.2将Docker的docker.service服务移动到 ...

  2. wireshark抓包实战(六),过滤器

    目录 一.抓包过滤器 1.语法来源 2.语法 二.显示过滤器 1.语法来源 2.关键要素 wireshark中,过滤器有两种,一种是抓包过滤器,一种是显示过滤器! 抓包过滤器适合大网络环境,配置与抓包 ...

  3. Dubbo 路由机制的实现

    Dubbo 路由机制是在服务间的调用时,通过将服务提供者按照设定的路由规则来决定调用哪一个具体的服务. 路由服务结构 Dubbo 实现路由都是通过实现 RouterFactory 接口.当前版本 du ...

  4. lr自带协议工具

    Lr自带的协议分析的工具: 录制脚本之前,选对协议很关键,否则错误的协议会导致Virtual User Generator 录制不到脚本,或录制的脚本不完整,有些应用可能需要选择多个协议才能完整的记录 ...

  5. 通过powershell查询OU中被禁用的AD账号,并删除他们的所属组

    这个需求可以通过两个方向来实现1.找到禁用的账号,删除除domain users外的所有组,脚本内容如下 #导入AD模块import-module ActiveDirectory #被禁用户$user ...

  6. 数据结构和算法(Golang实现)(6)简单入门Golang-并发、协程和信道

    并发.协程和信道 Golang语言提供了go关键字,以及名为chan的数据类型,以及一些标准库的并发锁等,我们将会简单介绍一下并发的一些概念,然后学习这些Golang特征知识. 一.并发介绍 我们写程 ...

  7. CSS盒模型属性详细介绍

    一.概述 CSS盒模型是定义元素周围的间隔.尺寸.外边距.边框以及文本内容和边框之间内边距的一组属性的集合. 示例代码: <!DOCTYPE html> <html lang=&qu ...

  8. AJ整理问题之:内存堆栈

    内存 数据在内存中的存放 在计算机中,运行的应用程序的数据都是保存在内存中的. 不同类型的数据,保存的内存区域不同,其中包括: 1:栈区(stack)由编译器自动分配并释放,一半存放函数的参数值,局部 ...

  9. 如何用 Python 绘制玫瑰图等常见疫情图

    新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见 ...

  10. 数据结构之循环队列Demo

    循环队列 比较简单,循环队列主要是判断队满.队空.有效元素个数 画图说明: 假设:队的长度为5(0-4) 但是实际maxsize为6,需要一个预留空间(不存储元素)做计算 继续添加3个元素后: 出队一 ...