题目链接:

  传送~~

题解:

    老夫实在是码不动了……

  正着搞显然不好做,尝试倒着乱搞。先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大。没被删除过的边时间戳都是0。然后瞎tarjan一次,建立双联通分量树。然后考虑每条被删除的边补会图中,相当于把两点所属双联通分量之间路径边权变为0。然后强行树剖一波即可。

  (调死人啦!

代码:

 

 #define Troy 10/19/2017

 #include <bits/stdc++.h>

 using namespace std;

 inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=1e5+; int n,m,q,ans[N]; struct Q{
int u,v,times,val;
inline void in(){
u=read(),v=read(),val=;
if(u>v) swap(u,v);
}
}query[N<<]; inline bool cmpx(Q a,Q b){
return a.u!=b.u?a.u<b.u:a.v<b.v;
} inline bool cmpy(Q a,Q b){
return a.times<b.times;
} struct edges{
int v;edges *last;
}edge[N<<],*head[N];int cnt; inline void push(int u,int v){
edge[++cnt]=(edges){v,head[u]};head[u]=edge+cnt;
} /**********************************************************************/ int dfn[N],low[N],bccno[N],idx,stk[N],top,bcc_cnt; inline void tarjan(int x,int fa){
dfn[x]=low[x]=++idx;
stk[++top]=x;
for(edges *i=head[x];i;i=i->last) if(i->v!=fa){
if(!dfn[i->v]){
tarjan(i->v,x);
low[x]=min(low[x],low[i->v]);
}else
low[x]=min(low[x],dfn[i->v]);
}
if(dfn[fa]<low[x]){
bcc_cnt++;int t;
do{
t=stk[top--];
bccno[t]=bcc_cnt;
}while(t!=x);
}
} /*****************************************************************/
int size[N],heavy[N],deep[N],g[N],f[N],tid[N]; inline void dfs(int x,int fa){
size[x]=;
for(edges *i=head[x];i;i=i->last)if(i->v!=fa){
deep[i->v]=deep[x]+;
f[i->v]=x;
dfs(i->v,x);
size[x]+=size[i->v];
if(size[i->v]>size[heavy[x]])
heavy[x]=i->v;
}
} inline void dfs(int x,int fa,int grand){
tid[x]=++idx;
g[x]=grand;
if(heavy[x])
dfs(heavy[x],x,grand);
for(edges *i=head[x];i;i=i->last)
if(i->v!=fa&&i->v!=heavy[x])
dfs(i->v,x,i->v);
} inline void init(){
n=read(),m=read();
for(int i=;i<=m;i++)
query[i].in();
sort(query+,query++m,cmpx);
int t=1e6;
while(){
int c=read(),a,b;
if(c==-) break;
a=read(),b=read();
if(a>b) swap(a,b);
if(c==){
int x=upper_bound(query+,query++m,(Q){a,b,,},cmpx)-query-;
query[x].times=t;
}else{
q++;
query[q+m]=(Q){a,b,t,};
}
t--;
}
sort(query+,query++q+m,cmpy);
for(int i=;i<=m+q&&query[i].times==;i++)
push(query[i].u,query[i].v),
push(query[i].v,query[i].u);
tarjan(,);
memset(head,,sizeof(head));cnt=;
for(int i=;i<=m+q&&query[i].times==;i++)
if(bccno[query[i].u]!=bccno[query[i].v])
push(bccno[query[i].u],bccno[query[i].v]),
push(bccno[query[i].v],bccno[query[i].u]);
dfs(,);
idx=;
dfs(,,);
} /********************************************************************/ struct Tree{
Tree *son[];
int val;
}*root,tree[N<<];int t_cnt; inline void build(Tree *&u,int l,int r){
u=tree+t_cnt;t_cnt++;
u->val=;
if(l==r){
u->son[]=u->son[]=NULL;
u->val=(l!=);
return;
}
int mid=l+r>>;
build(u->son[],l,mid);
build(u->son[],mid+,r);
for(int i=;i<;i++)
u->val+=u->son[i]->val;
} inline void change(Tree *u,int l,int r,int x,int y){
if((x<=l&&r<=y)||u->val==){
u->val=;
return;
}
int mid=l+r>>;
if(y>mid)
change(u->son[],mid+,r,x,y);
if(x<=mid)
change(u->son[],l,mid,x,y);
u->val=;
for(int i=;i<;i++)
u->val+=u->son[i]->val;
} inline int sum(Tree *u,int l,int r,int x,int y){
if(u->val==) return ;
if(x<=l&&r<=y)
return u->val;
int mid=l+r>>;
if(x>mid)
return sum(u->son[],mid+,r,x,y);
else if(y<=mid)
return sum(u->son[],l,mid,x,y);
else return sum(u->son[],l,mid,x,y)+sum(u->son[],mid+,r,x,y);
} inline void change(int x,int y){
while(g[x]!=g[y]){
if(deep[g[x]]<deep[g[y]])
swap(x,y);
change(root,,idx,tid[g[x]],tid[x]);
x=f[g[x]];
}
if(x==y) return;
if(deep[x]>deep[y])
swap(x,y);
change(root,,idx,tid[x]+,tid[y]);
} inline int sum(int x,int y){
int ret=;
while(g[x]!=g[y]){
if(deep[g[x]]<deep[g[y]])
swap(x,y);
ret+=sum(root,,idx,tid[g[x]],tid[x]);
x=f[g[x]];
}
if(x!=y){
if(deep[x]>deep[y])
swap(x,y);
ret+=sum(root,,idx,tid[x]+,tid[y]);
}
return ret;
} inline void work(){
build(root,,idx);
int t=q;
for(int i=;i<=m+q;i++)
if(query[i].times==)
continue;
else{
if(query[i].val==){
change(bccno[query[i].u],bccno[query[i].v]);
}
else{
ans[t]=sum(bccno[query[i].u],bccno[query[i].v]);
t--;
}
}
for(int i=;i<=q;i++)
printf("%d\n",ans[i]);
} int main(){
init();
work();
}

【BZOJ】1969: [Ahoi2005]LANE 航线规划的更多相关文章

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

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

  2. ●BZOJ 1969 [Ahoi2005]LANE 航线规划

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...

  3. 【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划

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

  4. BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]

    题意: 一张图,删除边,求两点之间的割边数量.保证任意时刻图连通 任求一棵生成树,只有树边可能是割边 时间倒流,加入一条边,就是两点路径上的边都不可能是割边,区间覆盖... 然后本题需要把边哈希一下, ...

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

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

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

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

  7. [Ahoi2005]LANE 航线规划

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

  8. BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 587  Solved: 259[Submit][Status][Discuss] Description ...

  9. 【bzoj1959】[Ahoi2005]LANE 航线规划 树链剖分+线段树

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

随机推荐

  1. Xcode9无线调试教程

    Xcode9最让人眼前一亮的莫过于同一局域网下支持无线部署调试. 从Xcode9支持无线部署调试来看,千呼万唤的iPhone8支持无线充电几乎是必然.下面简单梳理下无线调试的步骤: 1. 第一次部署调 ...

  2. DB2常用函数

    1.char函数  char(current date,ISO)--转换成yyyy-mm-dd  char(current date,USA)--转换成mm/dd/yyyy  char(current ...

  3. 【图文详解】HDFS基本原理

    本文主要详述了HDFS的组成结构,客户端上传下载的过程,以及HDFS的高可用和联邦HDFS等内容.若有不当之处还请留言指出. 当数据集大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区,并 ...

  4. python 之路,200行Python代码写了个打飞机游戏!

    早就知道pygame模块,就是没怎么深入研究过,恰逢这周未没约到妹子,只能自己在家玩自己啦,一时兴起,花了几个小时写了个打飞机程序. 很有意思,跟大家分享下. 先看一下项目结构 "" ...

  5. STL源码标注_空间适配器

    /* stl_alloc.h */ SGI STL空间适配器的主要由alloc.h和stl_alloc.h实现 SGI STL空间适配器的核心: 第一级适配器__malloc_alloc_templa ...

  6. 学习Timer定时器

    原文地址:http://www.cppblog.com/ivenher/articles/19969.html setTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器 ...

  7. MySQL-数据检索

    MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅 ...

  8. 分享一下在aspx页面弹框的设置代码

    public static class MessageBox { /// <summary> /// 显示消息提示对话框 /// </summary> /// <para ...

  9. CSS学习笔记三:自定义单选框,复选框,开关

    一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...

  10. mac下安装windows系统

    前言:我装win系统的原因很简单,就是某天突然想玩qq宠物了(不要嘲笑,自行尴尬一波)... 下面进入正题: 1.我的当前系统版本: 其实App Store 上新版本的os系统也已经出来很长一段时间了 ...