BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]
题意:
一张图,删除边,求两点之间的割边数量。保证任意时刻图连通
任求一棵生成树,只有树边可能是割边
时间倒流,加入一条边,就是两点路径上的边都不可能是割边,区间覆盖...
然后本题需要把边哈希一下,手写哈希比map快很多
貌似还有一种不用树剖的做法,不管了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+, M=1e5+, P=;
#define lc x<<1
#define rc x<<1|1
#define mid ((l+r)>>1)
#define lson lc, l, mid
#define rson rc, mid+1, r
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n, m, trn, mark[N], Q, c, x, y, del[M];
int Hash[P];
inline int& Map(int x) {return Hash[x%P];}
struct meow{int u, v;} a[M], tr[N];
struct qmeow{int c, u, v, qid;}q[M];
int ans[M]; struct Graph{
struct edge{int v, ne, id;} e[M<<];
int cnt, h[N];
inline void ins(int u, int v, int id) {
e[++cnt]=(edge){v, h[u], id}; h[u]=cnt;
e[++cnt]=(edge){u, h[v], id}; h[v]=cnt;
}
int vis[N];
void dfs(int u) {
vis[u]=;
for(int i=h[u];i;i=e[i].ne)
if(!vis[e[i].v]) {
mark[e[i].id]=;
tr[++trn]=a[e[i].id];
dfs(e[i].v);
}
}
}G; struct edge{int v, ne;} e[N<<];
int cnt, h[N];
inline void ins(int u, int v) {
e[++cnt]=(edge){v, h[u]}; h[u]=cnt;
e[++cnt]=(edge){u, h[v]}; h[v]=cnt;
}
int dfn[N], dfc, fa[N], top[N], deep[N], mx[N], size[N];
void dfs(int u) {
size[u]=;
for(int i=h[u];i;i=e[i].ne) {
int v=e[i].v;
if(v==fa[u]) continue;
deep[v]=deep[u]+; fa[v]=u;
dfs(v);
size[u]+=size[v];
if(size[v]>size[mx[u]]) mx[u]=v;
}
}
void dfs2(int u, int anc) { //printf("u anc %d %d\n",u,anc);
dfn[u] = ++dfc; top[u] = anc;
if(mx[u]) dfs2(mx[u], anc);
for(int i=h[u];i;i=e[i].ne)
if(e[i].v != fa[u] && e[i].v != mx[u]) dfs2(e[i].v, e[i].v);
} struct SegmentTree{
struct meow{
int sum, tag;
meow():tag(-){}
}t[N<<];
inline void paint(int x, int l, int r, int v) {
t[x].tag = v;
t[x].sum = (r-l+)*v;
}
inline void pushDown(int x, int l, int r) {
if(t[x].tag != -) {
paint(lson, t[x].tag);
paint(rson, t[x].tag);
t[x].tag = ;
}
}
void build(int x, int l, int r) {
if(l==r) t[x].sum=;
else {
build(lson); build(rson);
t[x].sum = t[lc].sum + t[rc].sum;
}
}
inline void cover(int x, int l, int r, int ql, int qr, int v) {
if(ql<=l && r<=qr) paint(x, l, r, v);
else {
pushDown(x, l, r);
if(ql<=mid) cover(lson, ql, qr, v);
if(mid<qr) cover(rson, ql, qr, v);
t[x].sum = t[lc].sum + t[rc].sum;
}
}
inline int que(int x, int l, int r, int ql, int qr) {
if(ql<=l && r<=qr) return t[x].sum;
else {
pushDown(x, l, r);
int ans=;
if(ql<=mid) ans+=que(lson, ql, qr);
if(mid<qr) ans+=que(rson, ql, qr);
return ans;
}
}
}S; void cover(int x, int y, int v) {
while(top[x] != top[y]) {
if(deep[top[x]] < deep[top[y]]) swap(x, y);
S.cover(,,n,dfn[top[x]],dfn[x],v);
x = fa[top[x]];
}
if(dfn[x] > dfn[y]) swap(x, y);
if(x!=y) S.cover(,,n,dfn[x]+,dfn[y],v);
}
int query(int x, int y) {
int ans=;
while(top[x] != top[y]) {
if(deep[top[x]] < deep[top[y]]) swap(x, y);
ans += S.que(,,n,dfn[top[x]],dfn[x]);
x = fa[top[x]];
}
if(dfn[x] > dfn[y]) swap(x, y);
if(x!=y) ans += S.que(,,n,dfn[x]+,dfn[y]);
return ans;
} int main() {
//freopen("in","r",stdin);
n=read(); m=read();
for(int i=; i<=m; i++) {
x=read(); y=read(); if(x>y) swap(x, y);
a[i]=(meow){x, y};
Map(x*n+y)=i;
}
while(true) {
c=read();
if(c==-) break;
x=read(); y=read(); if(x>y) swap(x, y);
q[++Q]=(qmeow){c, x, y, };
if(c==) del[ Map(x*n+y) ] = ;
else q[Q].qid = ++ans[];
}
for(int i=; i<=m; i++) if(!del[i]) G.ins(a[i].u, a[i].v, i); //printf("hi %d\n",i); G.dfs();
for(int i=; i<=trn; i++) ins(tr[i].u, tr[i].v);// printf("tr %d %d\n",tr[i].u, tr[i].v);
dfs(); dfs2(, );
S.build(, , n);
for(int i=; i<=m; i++) if(!mark[i] && !del[i]) cover(a[i].u, a[i].v, ); for(int i=Q; i>=; i--) { //printf("Q %d\n",i);
if(q[i].c==) cover(q[i].u, q[i].v, );
else ans[q[i].qid] = query(q[i].u, q[i].v);
}
for(int i=; i<=ans[]; i++) printf("%d\n",ans[i]);
}
BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]的更多相关文章
- BZOJ 1969: [Ahoi2005]LANE 航线规划( 树链剖分 )
首先我们要时光倒流, 倒着做, 变成加边操作维护关键边. 先随意搞出一颗树, 树上每条边都是关键边(因为是树, 去掉就不连通了)....然后加边(u, v)时, 路径(u, v)上的所有边都变成非关键 ...
- 【bzoj1959】[Ahoi2005]LANE 航线规划 树链剖分+线段树
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
- bzoj1969 [Ahoi2005]LANE 航线规划 树链剖分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1969 题解 如果我们把整个图边双联通地缩点,那么最终会形成一棵树的样子. 那么在这棵树上,\( ...
- ●BZOJ 1969 [Ahoi2005]LANE 航线规划
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...
- 【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划
Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel ...
- 【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)
1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星 ...
- 【BZOJ】1969: [Ahoi2005]LANE 航线规划
题目链接: 传送~~ 题解: 老夫实在是码不动了…… 正着搞显然不好做,尝试倒着乱搞.先给被删除的边标记一个时间戳,先删除的时间戳大,同时维护询问时间戳,询问早的时间戳大.没被删除过的边时间戳都是0 ...
- 洛谷 P2542 [AHOI2005]航线规划 树链剖分_线段树_时光倒流_离线
Code: #include <map> #include <cstdio> #include <algorithm> #include <cstring&g ...
- luogu2542 航线规划 (树链剖分)
不会lct,所以只能树剖乱搞 一般这种删边的题都是离线倒着做,变成加边 他要求的结果其实就是缩点以后两点间的距离. 然后先根据最后剩下的边随便做出一个生成树,然后假装把剩下的边当成加边操作以后处理 这 ...
随机推荐
- Can you find it?(哈希)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2141 Can you find it? Time Limit: 10000/3000 MS (Java ...
- 初识maven及其安装步骤!!
maven(01)--安装及其介绍 1:下载maven windows下载 2:将下载文件夹解压,然后放在一个安装目录(可任意选择),例如就放在D盘的根目录 然后在设置环境变量,新建一个环境变量, ...
- html5 文本格式化
通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替换 <i>标签使用.然而,这些标签的含义是不同的:<b> 与< ...
- JXLS 2.4.0系列教程(五)——更进一步的应用和页面边距bug修复
注:本文代码建立于前面写的代码.不过不看也不要紧. 前面的文章把JXLS 2.4.0 的基本使用写了一遍,现在讲讲一些更进一步的使用方法.我只写一些我用到过的方法,更多的高级使用方法请参考官网. ht ...
- 如何制作gif图片
制作Gif图片的方法很多,大多数情况下都会选择利用PS中的ImageReady插件来制作.其实还有其它更好的选择来制作Gift图片,其中一款软件就是利用Flash来实现.下面小编就给大家展示一下如何利 ...
- Yourphp系统发生错误
今天早用YP更新缓存,弹出如下错误: 随之而来的是错误信息是: [php] view plain copy [14-12-03 10:48:12] E:\wwwweb\xmwszt360\Core\L ...
- 给织梦DEDECMS添加栏目图片与英文名显示
开始做微网站了,不同于传统手机网站,因为微信上的微网站是支持CSS3与HTML5的,好吧,各种要学习的还有很多很多阿~这么多新代码,叹! 本来想转战帝国CMS了,奈何这名字太不对味了,PHPCMS也懒 ...
- 积分图实现均值滤波的CUDA代码
没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波.类似于OpenCV的blur()函数. 使用lena. ...
- CCF系列之数位之和(201512-1)
试题编号: 201512-1试题名称: 数位之和时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 ...
- mybatis_SQL映射(4)鉴别器
摘录自:http://blog.csdn.net/y172158950/article/details/17505739 鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的 ...