对于询问(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的更多相关文章

  1. 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组

    [BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...

  2. 【bzoj3488】[ONTAK2010]Highways DFS序+树上倍增+树状数组

    题目描述 一棵n个点的树,给定m条路径,q次询问包含一条路径的给定路径的个数+1 输入 The first line of input contains a single integer N(1< ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. H:Highways

    总时间限制: 1000ms 内存限制: 65536kB描述The island nation of Flatopia is perfectly flat. Unfortunately, Flatopi ...

  5. Highways(prim & MST)

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23421   Accepted: 10826 Descri ...

  6. poj2485 Highways

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  7. poj 2485 Highways 最小生成树

    点击打开链接 Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19004   Accepted: 8815 ...

  8. poj 2485 Highways

    题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...

  9. 【BZOJ】【3550】【ONTAK2010】Vacation

    网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...

随机推荐

  1. qsort用法总结

    一.对int类型数组排序 ]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(nu ...

  2. ios抓包官方文档

    OS X Programs OS X supports a wide range of packet trace programs, as described in the following sec ...

  3. 【SpringMVC】SpringMVC系列7之POJO 对象绑定请求参数值

      7.POJO 对象绑定请求参数值 7.1.概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值.而且支持级联属性.如:dept.deptId.dept ...

  4. SpringMVC请求处理流程

    从web.xml中 servlet的配置开始, 根据servlet拦截的url-parttern,来进行请求转发   Spring MVC工作流程图   图一   图二    Spring工作流程描述 ...

  5. iOS 关于UITableView的dequeueReusableCellWithIdentifier

    今天看代码的时候,突然想到了以前的一个问题. 刚学ios那会儿,常会写出以下代码 - (UITableViewCell *)tableView:(UITableView *)tableView cel ...

  6. Java for LeetCode 200 Number of Islands

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  7. Light OJ 1296 - Again Stone Game (博弈sg函数递推)

    F - Again Stone Game Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  8. Sublime Text 3 破解+ 汉化包

    破解: 第一步:打开主文件搜索十六进制F7D81AC02005 修改1AC0为B001 第二步:搜索 F3FF8BC7E895 修改其中的8BC7为33C0 第三步:过阻拦未注册提示 搜索 0F859 ...

  9. 二、JavaScript语言--JS基础--JavaScript进阶篇--事件响应

    1.什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户 ...

  10. .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等

    1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...