给两颗标号从1...n的树,保证标号小的点一定在上面。每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离。

比赛的时候想用倍增LCA做,但写渣了。。。。后来看到题解是主席树就写了一发

呆马:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#define inf 1000000007
#define maxn 100020
#define maxm 4200 using namespace std; int fa[maxn],ga[maxn],ll[maxn],rr[maxn],dep[maxn],gap[maxn];
int n,m,cnt; struct node
{
node *lc, *rc;
int key, cov;
node(){
key=;
cov=;
lc=rc=NULL;
}
}; struct ChairManTree
{
node *tree,*rot[maxn];
int tot;
node *new_node(){ return &tree[++tot];}
node *build(int l, int r)
{
node *now=new_node();
now->cov=now->key=;
if (l==r) return now;
int mid=(l+r)>>;
now->lc=build(l,mid);
now->rc=build(mid+,r);
return now;
} void down(node *p)
{
if (p->cov)
{
node *nl=new_node();
node *nr=new_node();
*nl=*p->lc;
*nr=*p->rc;
nl->key=max(p->lc->key,p->cov);
nl->cov=max(p->lc->cov,p->cov);
nr->key=max(p->rc->key,p->cov);
nr->cov=max(p->rc->cov,p->cov);
p->lc=nl;
p->rc=nr;
p->cov=;
}
} node *change(node *p, int l, int r, int ll, int rr, int x)
{
node *now=new_node();
if (ll<=l && r<=rr)
{
*now=*p;
now->key=max(now->key,x);
now->cov=max(now->cov,x);
return now;
}
down(p);
*now=*p;
int mid=(l+r)>>;
if (ll<=mid) now->lc=change(p->lc, l, mid, ll, rr, x);
if (rr>mid) now->rc=change(p->rc, mid+, r, ll, rr, x);
return now;
} int query(node *now, int l, int r, int x)
{
if (l==r) return now->key;
down(now);
int mid=(l+r)>>;
if (x<=mid) return query(now->lc, l, mid, x);
else return query(now->rc, mid+, r, x);
} void write(node *now,int l,int r)
{
if (l==r)
{
cout<<now->key;
return ;
}
down(now);
int mid=(l+r)>>;
write(now->lc,l,mid);
write(now->rc,mid+,r);
} void init(int n)
{
tree=new node[n*];
tot=;
}
void clear()
{
delete [] tree;
}
}s; vector<int> e[maxn]; void dfs(int x)
{
ll[x]=++cnt;
int n=e[x].size();
for (int i=;i<n;i++)
{
int k=e[x][i];
dfs(k);
}
rr[x]=cnt;
} int main()
{
//freopen("F.in","r",stdin);
while (scanf("%d%d",&n,&m)!=EOF)
{
s.init(n);
fa[]=ga[]=;
dep[]=gap[]=;
for (int i=;i<=n;i++) e[i].clear();
for (int i=;i<=n;i++) scanf("%d",&fa[i]), e[fa[i]].push_back(i), dep[i]=dep[fa[i]]+;
for (int i=;i<=n;i++) scanf("%d",&ga[i]), gap[i]=gap[ga[i]]+;
cnt=;
dfs(); s.rot[]=s.build(,n); for (int i=;i<=n;i++)
s.rot[i]=s.change(s.rot[ga[i]],,n,ll[i],rr[i],i);
int x,y,ans=;
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=(x+ans)%n+, y=(y+ans)%n+;
ans=s.query(s.rot[y],,n,ll[x]);
printf("%d %d %d\n",ans,dep[x]-dep[ans]+, gap[y]-gap[ans]+);
}
s.clear();
}
return ;
}

couple tree

Hiho 1232 北京网络赛 F Couple Trees的更多相关文章

  1. 2015北京网络赛 F Couple Trees 暴力倍增

    Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...

  2. acm 2015北京网络赛 F Couple Trees 树链剖分+主席树

    Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...

  3. acm 2015北京网络赛 F Couple Trees 主席树+树链剖分

    提交 题意:给了两棵树,他们的跟都是1,然后询问,u,v 表 示在第一棵树上在u点往根节点走 , 第二棵树在v点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第 ...

  4. (中等) Hiho 1232 Couple Trees(15年北京网络赛F题),主席树+树链剖分。

    "Couple Trees" are two trees, a husband tree and a wife tree. They are named because they ...

  5. hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)

    时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal processing. He has a device w ...

  6. HDU 5037 Frog(2014年北京网络赛 F 贪心)

    开始就觉得有思路,结果越敲越麻烦...  题意很简单,就是说一个青蛙从0点跳到m点,最多可以跳l的长度,原有石头n个(都仅表示一个点).但是可能跳不过去,所以你是上帝,可以随便在哪儿添加石头,你的策略 ...

  7. 2017北京网络赛 F Secret Poems 蛇形回路输出

    #1632 : Secret Poems 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – ...

  8. 2015北京网络赛 Couple Trees 倍增算法

    2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 q ...

  9. 2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

    2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x ...

随机推荐

  1. python3 抓取网页资源的 N 种方法

    1. 最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response ...

  2. jvisualVM 分析heapdump

    代码很简单,eclipse里面设置下最大堆空间为128m,: @Test public void testOutOfMemory() { List<NewsAddDto> document ...

  3. java beans

    There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...

  4. Windows一些零碎

    一.端口被占用: 1.netstat -ano |findstr 80 //查看3306端口是否存在 2.tasklist |findstr 3036(PID号)//查看pid为3036的是什么程序在 ...

  5. IOS的MVC和MVVM模式简明介绍

    iOS中的MVC(Model-View-Controller)将软件系统分为Model.View.Controller三部分,结构图如下: Model: 你的应用本质上是什么(但不是它的展示方式) C ...

  6. ubuntu不能正常登录

    在ubuntu登录界面,输入密码后,出现一个界面后一闪而过又返回登录界面.查看auth.log发现如下错误 May 15 15:42:19 tim-vm lightdm: pam_unix(light ...

  7. 扩展映射 Diffusion maps

    Diffusion maps接触到扩展映射,高维数据降维的相关东西. 扩展映射是一种非线性方法.

  8. docker 学习

    vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/docker daemon --bip=172.18.42.1/16 --r ...

  9. Java学习笔记,第三章

    Java基础语法 3.1类型.变量与运算符 3.1.1类型 Java可分为基本类型和类类型或参考类型.基本类型主要有 整数:可分为short整数(2字节,-32768 -- 32767),int整数( ...

  10. GMap.NET二次开发库

    GMap.NET的出现,解决了传统的依赖于地图引擎的代价高昂的解决方案,而且使用传统地图引擎,无法迁移,就连我们的地图放大缩小这样常规的方法,都是紧紧绑定在这些令人恶心的地图引擎开发包提供的SDK接口 ...