题目链接:

  传送~~

题解:

    老夫实在是码不动了……

  正着搞显然不好做,尝试倒着乱搞。先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大。没被删除过的边时间戳都是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. 分享一个国内首个企业级开源的GO语言网关--GoKu API Gateway

    一. 简介 GoKu API Gateway,中文名:悟空API网关,是国内首个开源go语言API网关,帮助企业进行API服务治理与API性能安全维护,为企业数字化赋能. GoKu API Gatew ...

  2. Android Selector原理

    android的selector对于android开发者而言再熟悉不过了,只要定义一个drawable目录下定义一个selector的xml文件,在布局文件中引用这个xml文件或者在代码中setBac ...

  3. sublime使用package control安装插件

    sublime本身可以集成Package Control来进行插件安装,非常方便. 1. 安装package control(插件包管理) 1.1 进入https://packagecontrol.i ...

  4. 10.API 接口自动化测试的基本原理

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 28.0px Helvetica } p.p2 { margin: 0.0px 0.0px 0.0px 0. ...

  5. SQL Server 远程更新目标表数据

    分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库. ** 温馨提示:如需转载本文,请注明内容出处.** 本文连接:http://www.cnblogs.c ...

  6. Android版本分布数据源

    先来Android官方数据地址:http://developer.android.com/intl/zh-cn/about/dashboards/index.html 友盟指数,这个对国内开发者比较有 ...

  7. Roundcube Webmail File Disclosure Vulnerability(CVE-2017-16651)

    Preface Software: https://roundcube.net/ Versions: 1.1.0 - 1.1.9, 1.2.0 - 1.2.6, 1.3.0 - 1.3.2 CVE: ...

  8. 安装RabbitMQ编译erlang时,checking for c compiler default output file name... configure:error:C compiler cannot create executables See 'config.log' for more details.

    checking for c compiler default output file name... configure:error:C compiler cannot create executa ...

  9. 架构之ELK日志分析系统

    ELK多种架构及优劣 既然要谈ELK在大数据运维系统中的应用,那么ELK架构就不得不谈.本章节引出四种笔者曾经用过的ELK架构,并讨论各种架构所适合的场景和优劣供大家参考. 先大致介绍ELK组件.EL ...

  10. 使用Selenium对新浪微博模拟登录

    Selenium的配置 在项目中引入Selenium库 下载chromedriver.exe 在项目代码中加入chromedriver位置的配置 使用Selenium Selenim语法 智能等待 隐 ...