P2542 【[AHOI2005]航线规划】
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]航线规划】的更多相关文章
- 洛谷 P2542 [AHOI2005]航线规划 解题报告
P2542 [AHOI2005]航线规划 题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系 ...
- P2542 [AHOI2005]航线规划 LCT维护双连通分量
\(\color{#0066ff}{ 题目描述 }\) 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel ...
- 洛谷P2542 [AHOI2005]航线规划(LCT,双连通分量,并查集)
洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一 ...
- 洛谷 P2542 [AHOI2005]航线规划(Link-cut-tree)
题面 洛谷 bzoj 题解 离线处理+LCT 有点像星球大战 我们可以倒着做,断边变成连边 我们可以把边变成一个点 连边时,如果两个点本身不联通,就\(val\)赋为\(1\),并连接这条边 如果,两 ...
- 洛谷 P2542 [AHOI2005]航线规划 树链剖分_线段树_时光倒流_离线
Code: #include <map> #include <cstdio> #include <algorithm> #include <cstring&g ...
- [AHOI2005] 航线规划
Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel ...
- AHOI2005航线规划 bzoj1969(LCT缩点)
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
- 【[AHOI2005]航线规划】
树剖维护边双 首先我们看到在整个过程中图是保证连通的,于是我们并不需要LCT来维护连通性 而这些询问询问的是两个点之间关键路径的数量,也就是无论怎么走都必须走的数量,显然这就是两点之间的割边的数量 由 ...
- [AHOI2005]航线规划——LCT维护边双联通分量
因为只能支持加入一个边维护边双,所以时光倒流 维护好边双,每次就是提取出(x,y)的链,答案就是链长度-1 具体维护边双的话, void access(int x){ for(reg y=0;x;y= ...
随机推荐
- 2017蓝桥杯购物单(C++B组)
原题: 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.这不,XX大促销又来了!老板夫人开出了长长的购物单,都是 ...
- 基于 Jepsen 来发现几个 Raft 实现中的一致性问题(2)
Nebula Graph 是一个高性能.高可用.强一致的分布式图数据库.由于 Nebula Graph 采用的是存储计算分离架构,在存储层实际只是暴露了简单的 kv 接口,采用 RocksDB 作为状 ...
- MODIS系列之NDVI(MOD13Q1)一:数据下载(一)基于插件
引言: 写MODIS数据处理这个系列文章的初衷,主要是为了分享本人处理MODIS数据方面的一些经验.鉴于网上对这方面系统性的总结还比较少,我搜集资料时也是走了许多的弯路,因此希望通过此文让初学者能够更 ...
- 更快地访问stackoverflow
使用火狐浏览器,安装扩展组件 Decentraleyes, 完成 原理:由于爆栈本身并没有被墙, 但使用了google的api,而google的api是被墙的. 该组件替换了国内不能访问的api,所以 ...
- Golang源码分析之目录详解
开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢? 目 ...
- [总结]最小生成树之Kruskal算法
目录 一.最小生成树的相关知识 1. 树的性质 2. 生成树 3. 最小生成树 4. 最小生成树的性质 二.Kruskal算法求最小生成树 1. 核心思想 2. 具体流程 3. 图示 4. 代码实施 ...
- L2 Softmax与分类模型
softmax和分类模型 内容包含: softmax回归的基本概念 如何获取Fashion-MNIST数据集和读取数据 softmax回归模型的从零开始实现,实现一个对Fashion-MNIST训练集 ...
- stand up meeting 1/13/2016
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 UI测试和调整:与主程序完成合并 6 查漏补缺,扫除UI ...
- O - Navigation System CodeForces - 1321D
题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数. 读题的时候题意特别不理解,何为最大次数,何为最小次数? ...
- 2007 NOIP T1奖学金
奖学金(07NOIPT1): [题目描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果 ...