【BZOJ】1969: [Ahoi2005]LANE 航线规划
题目链接:
题解:
老夫实在是码不动了……
正着搞显然不好做,尝试倒着乱搞。先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大。没被删除过的边时间戳都是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 航线规划的更多相关文章
- BZOJ 1969: [Ahoi2005]LANE 航线规划( 树链剖分 )
首先我们要时光倒流, 倒着做, 变成加边操作维护关键边. 先随意搞出一颗树, 树上每条边都是关键边(因为是树, 去掉就不连通了)....然后加边(u, v)时, 路径(u, v)上的所有边都变成非关键 ...
- ●BZOJ 1969 [Ahoi2005]LANE 航线规划
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...
- 【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划
Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel ...
- BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]
题意: 一张图,删除边,求两点之间的割边数量.保证任意时刻图连通 任求一棵生成树,只有树边可能是割边 时间倒流,加入一条边,就是两点路径上的边都不可能是割边,区间覆盖... 然后本题需要把边哈希一下, ...
- 【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)
1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星 ...
- 【BZOJ1969】[Ahoi2005]LANE 航线规划 离线+树链剖分+线段树
[BZOJ1969][Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由 ...
- [Ahoi2005]LANE 航线规划
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
- BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 587 Solved: 259[Submit][Status][Discuss] Description ...
- 【bzoj1959】[Ahoi2005]LANE 航线规划 树链剖分+线段树
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
随机推荐
- 2018 .NET开发者调查报告: .NET Core 是怎么样的状态
4月28日,在公众号里发起<.NET Core 使用调查>,该调查为期一周,有近3300名开发者参与. 已经使用.net core 的人数只有44%,计划使用.net core 比例达到 ...
- 北京一家JAVA开发公司面试题(留给后人)
1.jsp有哪些内置对象?作用分别是什么? 2.描述一下servlet的生命周期和基本架构. 3.多线程有几种实现方法,都是什么? 同步有几种实现方法,都是什么? 4.作用域public priv ...
- java——多态
多态定义:某一类事物的多种存在形态.对象的多态性.猫这类事物即具备猫的形态,又具备着动物的形态,这就是对象的多态性.简单说:就是一个对象对应着不同类型.多态在代码中的体现:父类或者接口的引用指向其子类 ...
- 使用commons-compress操作zip文件(压缩和解压缩)
http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...
- HttpDNS的坑以及一个针对安卓不太完善的测试方案
背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...
- 利用Python脚本悄无声息的遥控室友电脑开机密码!
整蛊一下室友就行了,切勿用于非法用途! 利用python脚本控制室友windows系统电脑的开机密码.利用random()生成随机数(密码),天知地知,密码只有你自己知道! Python代码分为cli ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- lambda隐藏函数的嵌套
# 隐藏函数嵌套 f = (lambda a,b :a if a>b else b)(1000, 2000008) print((lambda a,g:a if a > g else g) ...
- STL-Deque 源码剖析
G++ ,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Comp ...
- cocos2d-x学习之路之工作吐槽
经过大半年的cocos2d-x的学习,目前已在一个游戏创业公司实习,负责客户端的代码编写和维护.公司做了一款网游.比较给力,马上就要发布了.希望能够大卖.比较坑的是,居然电脑不给联网.查资料都不好查, ...