给两颗标号从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. HTML学习(零)简介

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

  2. Ubuntu 16.04安装搜狗输入法

    转载: http://www.it610.com/article/5319575.htm 打开firefox浏览器,输入网址www.baidu.com,打开后搜索搜狗拼音 linux进入到搜狗拼音li ...

  3. android studio This client is too old to work with the working copy at

    http://www.cnblogs.com/maijin/archive/2013/01/09/2852330.html http://stackoverflow.com/questions/283 ...

  4. WebApp开发框架Ionic+AngularJS+Cordova

    目前的手机APP有三类:原生APP.WebAPP.HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Ionic Ionic是一个新的.可以使用HTML5构建混合移动应用 ...

  5. Ubuntu 查找命令

    Ubuntu 查找文件夹 使用find命令查找find / -name 文件夹名称 -type d找到结果中含有路径 查找命令 从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR” ...

  6. Servlet(五岁以下儿童)web.xml一些常用的配置

    (1)lode-on-startup,这Servlet该项目启动时它将被称为(从主要的电话init办法,为了安全起见,一般不应为Servlet建立URL制图).一些数据通常被用作前处理,或使用多线程建 ...

  7. unix命令自我总结

    三种参数类型 1⃣时间日期: cal times time 2⃣文字处理: ctl+v 输入控制字符 ${#str} str字符串长度 expr length $abc 同上 typeset -i x ...

  8. JAVA EE------XML

    1.XML定义:在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语 ...

  9. UVA-10689 Yet another Number Sequence (矩阵二分幂模板)

    题目大意:已知递推公式和边缘值,求某项的最后m(0<m<5)位数字. 题目分析:矩阵二分幂的模板题. 代码如下: # include<iostream> # include&l ...

  10. js_如何优化你的代码让它更好看

    1.对于美的东西我们很难拒绝,比如美女.哈哈哈,程序员的梗. 2.所以我希望我写出来的代码也是很美观的,让人看起来会很舒服. 3.要想让你的代码简约美观,就要涉及封装,模块化了,可复用代码.vue可以 ...