【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树
【BZOJ1969】[Ahoi2005]LANE 航线规划
Description
在5个星球之间,有5条探险航线。 A、B两星球之间,如果某条航线不存在,就无法从A星球抵达B星球,我们则称这条航线为关键航线。 显然上图中,1号与5号星球之间的关键航线有1条:即为4-5航线。 然而,在宇宙中一些未知的磁暴和行星的冲撞,使得已有的某些航线被破坏,随着越来越多的航线被破坏,探险飞船又不能及时回复这些航线,可见两个星球之间的关键航线会越来越多。 假设在上图中,航线4-2(从4号星球到2号星球)被破坏。此时,1号与5号星球之间的关键航线就有3条:1-3,3-4,4-5。 小联的任务是,不断关注航线被破坏的情况,并随时给出两个星球之间的关键航线数目。现在请你帮助完成。Input
Output
Sample Input
1 2
1 3
3 4
4 5
4 2
1 1 5
0 4 2
1 5 1
-1
Sample Output
3
题解:既然能离线搞肯定要离线啦~由于保证了最后时刻图是联通的,所以我们先求出一棵生成树,然后反着往树上加边。每加一条边,就相当于将这条边覆盖的所有树边都打上标记,意味着它们不再是关键路径。查询时,看一下路径上有多少条未标记的边就行了。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <utility>
#define MP(A,B) make_pair(A,B)
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxm=200010;
const int maxn=30010;
typedef pair<int,int> pii;
int n,m,q,cnt;
int to[maxm],next[maxm],head[maxn],val[maxm],dep[maxn],fa[maxn],top[maxn],son[maxn],siz[maxn],p[maxn];
int s[maxn<<2],tag[maxn<<2],qa[maxm],qb[maxm],op[maxm],ans[maxm],pa[maxm],pb[maxm];
map<pii,int> mp;
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void build(int l,int r,int x)
{
if(l==r)
{
s[x]=(l!=1);
return ;
}
int mid=l+r>>1;
build(l,mid,lson),build(mid+1,r,rson);
s[x]=s[lson]+s[rson];
}
void pushdown(int x)
{
if(tag[x]) tag[lson]=tag[rson]=1,s[lson]=s[rson]=0,tag[x]=0;
}
void updata(int l,int r,int x,int a,int b)
{
if(a<=l&&r<=b)
{
s[x]=0,tag[x]=1;
return ;
}
pushdown(x);
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b);
if(b>mid) updata(mid+1,r,rson,a,b);
s[x]=s[lson]+s[rson];
}
int query(int l,int r,int x,int a,int b)
{
if(a<=l&&r<=b) return s[x];
pushdown(x);
int mid=l+r>>1;
if(b<=mid) return query(l,mid,lson,a,b);
if(a>mid) return query(mid+1,r,rson,a,b);
return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
}
void add(int a,int b)
{
mp[MP(max(a,b),min(a,b))]=cnt,to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,next[cnt]=head[b],head[b]=cnt++;
}
void dfs1(int x)
{
siz[x]=1;
for(int i=head[x];i!=-1;i=next[i])
{
if(!dep[to[i]]&&!val[i])
{
dep[to[i]]=dep[x]+1,fa[to[i]]=x,dfs1(to[i]),siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
else
{
if(to[i]!=fa[x]&&!val[i]&&!val[i^1]) pa[++pa[0]]=x,pb[pa[0]]=to[i];
val[i]=1;
}
}
}
void dfs2(int x,int tp)
{
top[x]=tp,p[x]=++p[0];
if(son[x]) dfs2(son[x],tp);
for(int i=head[x];i!=-1;i=next[i])
if(!val[i]&&to[i]!=son[x])
dfs2(to[i],to[i]);
}
void modify(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
updata(1,n,1,p[top[x]],p[x]),x=fa[top[x]];
}
if(x==y) return ;
if(dep[x]>dep[y]) swap(x,y);
updata(1,n,1,p[x]+1,p[y]);
}
int ask(int x,int y)
{
int ret=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret+=query(1,n,1,p[top[x]],p[x]),x=fa[top[x]];
}
if(x==y) return ret;
if(dep[x]>dep[y]) swap(x,y);
return ret+query(1,n,1,p[x]+1,p[y]);
}
int main()
{
n=rd(),m=rd();
int i,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++) a=rd(),b=rd(),add(a,b);
while(1)
{
op[++q]=rd();
if(op[q]==-1) break;
qa[q]=rd(),qb[q]=rd();
if(!op[q])
{
a=mp[MP(max(qa[q],qb[q]),min(qa[q],qb[q]))];
val[a]=val[a^1]=1;
}
}
dep[1]=1,dfs1(1),dfs2(1,1),build(1,n,1);
for(i=1;i<=pa[0];i++) modify(pa[i],pb[i]);
for(i=q-1;i>=1;i--)
{
if(!op[i]) modify(qa[i],qb[i]);
else ans[i]=ask(qa[i],qb[i]);
}
for(i=1;i<q;i++) if(op[i]) printf("%d\n",ans[i]);
return 0;
}
//5 5 1 2 1 3 3 4 4 5 4 2 1 1 5 0 4 2 1 5 1 -1
【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树的更多相关文章
- 【bzoj1959】[Ahoi2005]LANE 航线规划 树链剖分+线段树
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
- 【bzoj2402】陶陶的难题II 分数规划+树链剖分+线段树+STL-vector+凸包+二分
题目描述 输入 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi (1<=yi& ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- 2019西北工业大学程序设计创新实践基地春季选拔赛 I Chino with Rewrite (并查集+树链剖分+线段树)
链接:https://ac.nowcoder.com/acm/contest/553/I 思路:离线整棵树,用并查集维护下联通的情况,因为值只有60个,用2的x(1<=x<=60)次方表示 ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- 【bzoj3626】[LNOI2014]LCA 树链剖分+线段树
题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
随机推荐
- 洛谷——P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- Scala之Future
一.简介 Future提供了一套高效便捷的非阻塞并行操作管理方案.其基本思想很简单,所谓Future,指的是一类占位符对象,用于指代某些尚未完成的计算的结果.一般来说,由Future指代的计算都是并行 ...
- ORACLE普通表转换成分区表
转http://mp.weixin.qq.com/s?__biz=MzAwMjkyMjEwNg==&mid=2247484761&idx=1&sn=ce080581145931 ...
- 【Salvation】——项目进展&已取得的成果
写在前面:这个项目为原创团体项目,其中美术设计与部分关卡功能为其他成员完成,我负责的部分以角色动画和登录注册为主. 一.游戏美术设计 游戏背景,道具,动物,人物帧动画制作全部完成. 1.人物 2.游戏 ...
- 2016.8.19 将div设置为隐藏使用style=“display:none”
style="display:none"表示隐藏. style="display:block"表示显示. 在代码中则使用$("#id").s ...
- SourceTree的基本使用-git on mac
SourceTree的基本使用 学习了:https://www.cnblogs.com/tian-xie/p/6264104.html
- 每天5道面试题(二)java基础
说出Servlet的生命周期,并说出Servlet和CGI的差别 Servlet被server实例化后,容器执行其init方法,请求到达时执行其service方法,service方法自己主动派遣执行与 ...
- centos6.5下载
1.64位系统 http://mirrors.163.com/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso http://mirrors. ...
- 『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)
起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部 ...
- SharePoint 2013 和 SharePoint 2010 功能对比
微软的网站找东西太麻烦了,在这记录一下. 从 SharePoint 2010 更改为 SharePoint 2013 http://technet.microsoft.com/zh-cn/librar ...