给两颗标号从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. List转换成json格式字符串,json格式字符串转换成list

    一.List转换成json字符串 这个比较简单,导入gson-x.x.jar, List<User> users = new ArrayList<User>(); Gson g ...

  2. SOLD原则

    借鉴: 1. 单一职责原则 单一职责原则 (Single Responsibility Principle,SRP) 指出,每个方法或类应当有且仅有 一个改变的理由.这意味着每个方法或类应当做一件事情 ...

  3. Android课程---关于GridView网格视图的学习

    activity_ui6.xml <?xml version="1.0" encoding="utf-8"?> <GridView xmlns ...

  4. IOS网络第五天 AFN-02-文件上传,底部弹出窗体,拍照和相册获取图片上传

    ************** #import "HMViewController.h" #import "AFNetworking.h" @interface ...

  5. C语言中定义全局变量

    (1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef  _XX_头文件.H #define  _XX_头文件.H in ...

  6. github搭建静态博客

    p { margin-bottom: 0.1in; line-height: 120% } 1. 创建Repository 创建一个与自己github用户名对应的Repository,例如:abc.g ...

  7. 刷新DNS命令 如何刷新DNS缓存(flushdns)

    运行:ipconfig /displaydns这个命令,查看一下本机已经缓存了那些的dns信息的,然后输入下面的命令 ipconfig /flushdns               这时本机的dns ...

  8. The method getDispatcherType() is undefined for the type HttpServletRequest

    在使用百度的ueditor的时候,老是报错: The method getDispatcherType() is undefined for the type HttpServletRequest 原 ...

  9. MVC中的一些坑

    1.@字符在.cshtml文件中不能启用 经过2个小时求解,发现是配置文件web.config中引用的namespace少了System.Web.Optimization,所以不能启用,因为创建的空的 ...

  10. Apache2 worker

    http://www.php-internals.com/book/?p=chapt08/08-03-zend-thread-safe-in-php 在多线程系统中,进程保留着资源所有权的属性,而多个 ...