BZOJ3488 : [ONTAK2010]Highways
对于询问(x,y),恰经过一条非树边且不经过树上两点间路径的路径数为:
·若x与y成祖先-孩子关系,假设y是x的祖先,z是y到x方向的第一个节点,则
ans=起点在x的子树里,且终点不在z的子树里的非树边数
·若x与y不成祖先-孩子关系,则
ans=起点在x的子树里,且终点在y的子树里的非树边数
由于不经过任何非树边也有一解,所以答案要加1
求出DFS序后线段树合并即可解决
#include<cstdio>
const int N=100010,BUF=10500100;
int n,m,i,x,y,ans;char Buf[BUF],*buf=Buf;
int g[N],nxt[N<<1],v[N<<1],ed,d[N],size[N],son[N],top[N],f[N],st[N],en[N],dfn;
int G[N],NXT[N<<1],V[N<<1],sum[N];
struct Node{int v;Node*l,*r;}pool[7200010],*cur=pool,*T[N];
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void swap(int&x,int&y){int z=x;x=y;y=z;}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void ADD(int x,int y){V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}
void dfs(int x){
size[x]=1;
for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){
d[v[i]]=d[f[v[i]]=x]+1;dfs(v[i]);size[x]+=size[v[i]];
if(size[v[i]]>size[son[x]])son[x]=v[i];
}
}
void dfs2(int x,int y){
st[x]=++dfn;top[x]=y;
if(son[x])dfs2(son[x],y);
for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);
en[x]=dfn;
}
inline int lca2(int x,int y){
int t;
while(top[x]!=top[y])t=top[y],y=f[top[y]];
return x==y?t:son[x];
}
Node*merge(Node*x,Node*y,int a,int b){
if(!x)return y;
if(!y)return x;
Node*z=cur++;z->v=x->v+y->v;
if(a==b)return z;
int mid=(a+b)>>1;
return z->l=merge(x->l,y->l,a,mid),z->r=merge(x->r,y->r,mid+1,b),z;
}
void ins(Node*&x,int a,int b,int c){
if(!x)x=cur++;x->v++;
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)ins(x->l,a,mid,c);else ins(x->r,mid+1,b,c);
}
int ask(Node*x,int a,int b,int c,int d){
if(!x)return 0;
if(c<=a&&b<=d)return x->v;
int mid=(a+b)>>1,t=0;
if(c<=mid)t=ask(x->l,a,mid,c,d);
if(d>mid)t+=ask(x->r,mid+1,b,c,d);
return t;
}
void dfs3(int x){
T[x]=cur++;
for(int i=G[x];i;i=NXT[i])ins(T[x],1,n,V[i]),sum[x]++;
for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x])dfs3(v[i]),T[x]=merge(T[x],T[v[i]],1,n),sum[x]+=sum[v[i]];
}
int main(){
fread(Buf,1,BUF,stdin),read(n);
for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
for(dfs(1),dfs2(1,1),ed=0,read(m);m--;ADD(x,st[y]),ADD(y,st[x]))read(x),read(y);
for(dfs3(1),read(m);m--;printf("%d\n",ans+1)){
read(x),read(y);
if(d[x]<d[y])swap(x,y);
if(st[y]<=st[x]&&en[x]<=en[y])y=lca2(y,x),ans=sum[x]-ask(T[x],1,n,st[y],en[y]);
else ans=ask(T[x],1,n,st[y],en[y]);
}
return 0;
}
BZOJ3488 : [ONTAK2010]Highways的更多相关文章
- 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组
[BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...
- 【bzoj3488】[ONTAK2010]Highways DFS序+树上倍增+树状数组
题目描述 一棵n个点的树,给定m条路径,q次询问包含一条路径的给定路径的个数+1 输入 The first line of input contains a single integer N(1< ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- H:Highways
总时间限制: 1000ms 内存限制: 65536kB描述The island nation of Flatopia is perfectly flat. Unfortunately, Flatopi ...
- Highways(prim & MST)
Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23421 Accepted: 10826 Descri ...
- poj2485 Highways
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- poj 2485 Highways 最小生成树
点击打开链接 Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19004 Accepted: 8815 ...
- poj 2485 Highways
题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...
- 【BZOJ】【3550】【ONTAK2010】Vacation
网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...
随机推荐
- Unity3d LineRenderer画线
原地址:http://www.cnblogs.com/88999660/archive/2013/01/21/2869498.html 1. 画多条线 画多条线需要在场景中放置多个GameObjec ...
- MVC数据验证
深入浅出 MVC 数据验证 2.0 [附演示源码] 今天在这里给大家介绍一下MVC的数据验证框架. 在1.0版中,很多朋友提出了怎么使用客户端验证,今天找了一些资料,发现了客户端验证的方法. 1.MV ...
- HDFS 原理、架构与特性介绍--转载
原文地址:http://www.uml.org.cn/sjjm/201309044.asp 本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前H ...
- iOS 推荐一个下载用的第三方库
AFNetworking有下载功能,但是下载功能比较基本,要实现复杂下载功能需要自己写一些代码.今天在github上找到了一个下载功能的开源项目,非常不错,链接如下:https://github.co ...
- Linux删除乱码文件
2015年2月28日 17:11:54 1. ls -i 列出文件的inode号 ??Φ-ͦ?+?-ˬͩ-????-??.doc 2. find folder -inum -delete -de ...
- Adobe Flash Player 因过期而遭到阻止 更新插件 运行一次 解决方法
老机器运行 10.3.183.90 比较流畅 可是 Chrome 浏览器提示 Adobe Flash Player 因过期而遭到阻止 更新插件 运行一次 每次单击 运行一次 才运行,这样每次提醒很烦人 ...
- 1.前端笔记之html
title: 1.前端笔记之HTML date: 2016-04-04 23:21:52 tags: Python categories: Python --- 作者:刘耀 **出处:http://w ...
- 读取STL模型
读取二进制格式的STL模型文件 std::ifstream fin;fin.open(stlFilePath, std::ios::in | std::ios::binary);bool isBina ...
- MFC 颜色选择对话框、颜色按钮
COLORREF color=RGB(0,255,0); unsigned char r=GetRValue(color); unsigned char g=GetGValue(color); uns ...
- apple配置WIFI热点
打开AirPort打开设置偏好-共享,找到WIFI相关