复制的树缩点,主席树查k小,毫无技术含量,纯码农题。

#include<bits/stdc++.h>
#define u first
#define v second
#define F lower_bound
#define I (i+j+2>>1)
#define J (i+j>>1)
using namespace std;
int n1,n2,m,n4;
typedef long long ll;
map<ll,int>nu;
const int N=1e5+5;
struct edge{
int v;edge*s;
}z[N*2];
edge*a=z,*h[N];
void ins(int u,int v){
edge s={v,h[u]};
*(h[u]=a++)=s;
}
typedef int arr[N];
arr l,r,b,po,id,d[2],p[2][17];
ll n3,u,v,c[N];
void dfs(int u){
r[id[l[u]=++n4]=u]=1;
for(edge*i=h[u];i;i=i->s)
if(i->v^p[0][0][u]){
d[0][i->v]=d[0][p[0][0][i->v]=u]+1;
dfs(i->v);
r[u]+=r[i->v];
}
}
typedef struct node*ptr;
struct node{
ptr i,j;int s;
}e[N][17];
void ins(int i,int j,int s,ptr u,ptr v){
while(i<j){
*v=*u;
if(s>J)u=u->j,v=v->j=v+1,i=J+1;
else
++v->s,u=u->i,v=v->i=v+1,j=I-1;
}
}
int ask(int i,int j,int k,ptr u,ptr v){
while(i<j){
int s=v->s-u->s;
if(k<=s)u=u->i,v=v->i,j=I-1;
else
k-=s,u=u->j,v=v->j,i=J+1;
}
return i;
}
int lca(int i,int s,int t){
if(d[i][s]<d[i][t])swap(s,t);
int k=d[i][s]-d[i][t];
for(int j=16;~j;--j)
if(k>>j&1)s=p[i][j][s];
if(s==t)return s;
for(int j=16;~j;--j)
if(p[i][j][s]^p[i][j][t])
s=p[i][j][s],t=p[i][j][t];
return p[i][0][s];
}
typedef pair<int,int>vec;
typedef pair<vec,int>tri;
tri ask(ll v){
typeof(nu.end())j=nu.F(v);
int s=po[j->v];
return tri(vec(ask(1,n1,v-j->u+r[s],e[l[s]-1],e[l[s]+r[s]-1]),s),j->v);
}
int ask(int s,int k){
for(int j=16;~j;--j)
if(k>>j&1)s=p[1][j][s];
return s;
}
int main(){
scanf("%d%d%d",&n1,&n2,&m),++n2;
for(int i=2;i<=n1;++i)
scanf("%lld%lld",&u,&v),ins(u,v),ins(v,u);
dfs(po[nu[n3=n1]=1]=1);
e[0][0]=(node){e[0],e[0]};
for(int i=1;i<=n1;++i)
ins(1,n1,id[i],e[i-1],e[i]);
for(int i=2;i<=n2;++i){
scanf("%lld%lld",&u,&v);
tri s=ask(v);
d[1][i]=d[1][p[1][0][i]=s.v]+1,c[i]=c[s.v]+d[0][b[i]=s.u.u]-d[0][s.u.v]+1,po[nu[n3+=r[u]]=i]=u;
}
for(int i=1;i<17;++i){
for(int j=1;j<=n1;++j)
p[0][i][j]=p[0][i-1][p[0][i-1][j]];
for(int j=2;j<=n2;++j)
p[1][i][j]=p[1][i-1][p[1][i-1][j]];
}
while(m--){
scanf("%lld%lld",&u,&v);
tri s1=ask(u),t1=ask(v);
int l1=lca(1,s1.v,t1.v);
int s2=s1.u.u,t2=t1.u.u;
ll l3=0;
if(s1.v^l1){
int s3=ask(s1.v,d[1][s1.v]-d[1][l1]-1);
l3+=d[0][s2]-d[0][s1.u.v]+c[s1.v]-c[s3]+1,s2=b[s3];
}
if(t1.v^l1){
int t3=ask(t1.v,d[1][t1.v]-d[1][l1]-1);
l3+=d[0][t2]-d[0][t1.u.v]+c[t1.v]-c[t3]+1,t2=b[t3];
}
int l2=lca(0,s2,t2);
l3+=d[0][s2]+d[0][t2]-d[0][l2]*2;
printf("%lld\n",l3);
}
}

BZOJ4539: [Hnoi2016]树的更多相关文章

  1. [BZOJ4539][HNOI2016]树(主席树)

    4539: [Hnoi2016]树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 746  Solved: 292[Submit][Status][D ...

  2. BZOJ4539 [Hnoi2016]树 【倍增 + 主席树】

    题目链接 BZOJ4539 题解 我们把每次复制出来的树看做一个点,那么大树实际上也就是一棵\(O(M)\)个点的树 所以我们只需求两遍树上距离: 大树上求距离,进入同一个点后在模板树上再求一次距离 ...

  3. 2019.03.25 bzoj4539: [Hnoi2016]树(主席树+倍增)

    传送门 题意:给一棵大树,令一棵模板树与这棵树相同,然后进行mmm次操作,每次选择模板树中的一个节点aaa和大树中一个节点bbb,把aaa这棵子树接在bbb上面,节点编号顺序跟aaa中的编号顺序相同. ...

  4. BZOJ 4539: [Hnoi2016]树 [主席树 lca]

    4539: [Hnoi2016]树 题意:不想写.复制模板树的子树,查询两点间距离. *** 终于有一道会做的题了...... 画一画发现可以把每次复制的子树看成一个大点来建一棵树,两点的lca一定在 ...

  5. 【LG3248】[HNOI2016]树

    [LG3248][HNOI2016]树 题面 洛谷 题解 因为每次你加入的点是原树上某一棵子树 那么我们一次加入一个点,代表一棵子树加到大树下面 那么我们要找到一个点在一个大点中用主席树在\(dfs\ ...

  6. 4539: [Hnoi2016]树

    4539: [Hnoi2016]树 链接 分析: 主席树+倍增. 代码: #include<cstdio> #include<algorithm> #include<cs ...

  7. [HNOI2016]树(可持久化线段树+树上倍增)

    [HNOI2016]树(可持久化线段树+树上倍增) 题面 给出一棵n个点的模板树和大树,根为1,初始的时候大树和模板树相同.接下来操作m次,每次从模板树里取出一棵子树,把它作为新树里节点y的儿子.操作 ...

  8. bzoj 4539: [Hnoi2016]树

    Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,-,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ...

  9. [HNOI2016]树

    Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,…,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ...

随机推荐

  1. HTML学习(零)简介

    一)HTML介绍 它是一个超文本标记语言,静态页面. 所谓的'超文本'就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 主要的结构为包括"头"部分(英语:Head).和 ...

  2. Node.js 教程 04 - 模块系统

    前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简 ...

  3. [MySQL Reference Manual]15. 其他存储引擎

    15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...

  4. 无法解析指定对象的 TargetProperty (UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)“的异常解决

    最近在写动画的时候做一个倒计时的效果,就是数字从大到小的一个动画,但是当我设置要new PropertyPath("XXXXXXX")的时候却报了标题的异常,各种报错.百度了好久也 ...

  5. kmeans算法并行化的mpi程序

    用c语言写了kmeans算法的串行程序,再用mpi来写并行版的,貌似参照着串行版来写并行版,效果不是很赏心悦目~ 并行化思路: 使用主从模式.由一个节点充当主节点负责数据的划分与分配,其他节点完成本地 ...

  6. 记录 git 常用的操作命令总结

    记录 git 常用的操作命令总结 2016-12-15 16:44:04 作为一名开发者,熟悉使用 git 代码管理工具是一项必备的基本技能.git 相较 SVN 而言,其优点不言而喻.git 的功能 ...

  7. 8.dns服务的搭建

    一.DNS的相关配置文件 /etc/hosts    本地主机列表 /etc/nssswitch.conf     本地主机查询方式 /etc/host.conf /etc/resolv.conf   ...

  8. android 利用Handler触发另一个activity方法

    如activityA代码: activityB = new ActivtyB(mHandler,CLOSE_SEARCH_MSG);//新建对像B传递,一个handler和Message,然后在act ...

  9. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  10. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...