对于询问(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. 正则匹配之url的匹配

    通过这几天的学习,已经对正则有所了解了. 下面动手写一个匹配url的正则吧. <?php $str="http://www.baidu.com"; $reg="/( ...

  2. 百度图片爬虫-python版

               self.browser=imitate_browser.BrowserBase()            self.chance=0            self.chanc ...

  3. 消息通信库ZeroMQ 4.0.4安装指南

    一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如Ac ...

  4. 将mysql的查询结果导出为csv

    要将mysql的查询结果导出为csv,一般会使用php连接mysql执行查询,将返回的查询结果使用php生成csv格式再导出. 但这样比较麻烦,需要服务器安装php才可以实现. 直接使用mysql导出 ...

  5. Centos6.7安装Apache2.4+Mysql5.6+Apache2.4

    首先说下思路,因为一开始系统上已经跑了一套完成的 PHP 环境,那时候都是快速自动安装的,如果是跑一些5.3以下版本的话,很简单,几个指令,10分钟搞定了. 但现在要升级,彻底一点的话,唯有推倒重来了 ...

  6. c# 继承,多态,new /overrid 区别, 引用父类的方法

    好久没碰c#了,偶尔需要制作点小工具.为了一个灵活的架构设计,需要对继承/多态有比较深刻的理解. 不料忘得差不多了,好吧,再来回忆下.直接上代码了,如下: using System; using Sy ...

  7. ubuntu创建文件夹快捷方式命令

    sudo ln -sT /path/to/source/directory  /path/to/destination/directory 注意路径一定要用 绝对路径 例: /site-package ...

  8. 《ASP.NET1200例》实现投票的用户控件

    用户控件ascx <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="24 ...

  9. Java for LeetCode 045 Jump Game II

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  10. Lubuntu下配置Python开发环境

    安装完系统必须要做的几件事: 一.更新软件    (如果是通过最新版镜像安装,可无视此步骤)    1.选择速度比较快的源,默认的源速度不一定快.二.配置终端    1.设置终端背景,前景色,透明度  ...