题目链接:

  传送~~

题解:

    老夫实在是码不动了……

  正着搞显然不好做,尝试倒着乱搞。先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大。没被删除过的边时间戳都是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. solr研磨之facet

    作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...

  2. 细说Web页面与本地电脑通讯

    话说在很久很久以前.Web页面与客户的本地电脑Localhost通讯,有两种方式: 1.Flash 2.ActiveX控件 由于Flash本人不是很了解,也给出不了什么示例代码, 对于ActiveX控 ...

  3. 《MySQL必知必会》读书笔记_4

    PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BE ...

  4. JVM笔记8-虚拟机性能监控与故障处理工具

    1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...

  5. 【转载】Linux Cache Mechanism Summary(undone)

    http://www.cnblogs.com/LittleHann/p/3904909.html 目录 1. 缓存机制简介 2. 内核缓存机制 3. 内存缓存机制 4. 文件缓存机制 5. 数据库缓存 ...

  6. Day15 Javascipt内容补充

    JavaScript函数: 函数: function 函数名(a,b,c){ 执行代码 } 1,如何去找到标签 Dom直接选择器: 1,找到标签 #获取单个元素 document.getElement ...

  7. scons脚本示例

    import os def list_dir(dir): all_dirs = [] for root, dirs, files in os.walk('./', True): for name in ...

  8. 对于程序员在boss直聘求职的建议

    最近为一个岗位的招聘,在直聘伤刷了三百份简历 0.上传简历最好是PDF,word简历在不同的系统和软件下排版可能会出问题. 1.新职位投得要快,后面投的,有可能看不到. 为了投的命中率,投之前最好看一 ...

  9. Codeforces Round #479 (Div. 3) A. Wrong Subtraction

    题目网址:http://codeforces.com/contest/977/problem/A 题解:给你一个数n,进行k次变换,从末尾开始-1,512变成511,511变成510,510会把0消掉 ...

  10. HDU-5705

    Clock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem De ...