Hiho 1232 北京网络赛 F Couple Trees
给两颗标号从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的更多相关文章
- 2015北京网络赛 F Couple Trees 暴力倍增
Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...
- acm 2015北京网络赛 F Couple Trees 树链剖分+主席树
Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...
- acm 2015北京网络赛 F Couple Trees 主席树+树链剖分
提交 题意:给了两棵树,他们的跟都是1,然后询问,u,v 表 示在第一棵树上在u点往根节点走 , 第二棵树在v点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第 ...
- (中等) Hiho 1232 Couple Trees(15年北京网络赛F题),主席树+树链剖分。
"Couple Trees" are two trees, a husband tree and a wife tree. They are named because they ...
- hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)
时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal processing. He has a device w ...
- HDU 5037 Frog(2014年北京网络赛 F 贪心)
开始就觉得有思路,结果越敲越麻烦... 题意很简单,就是说一个青蛙从0点跳到m点,最多可以跳l的长度,原有石头n个(都仅表示一个点).但是可能跳不过去,所以你是上帝,可以随便在哪儿添加石头,你的策略 ...
- 2017北京网络赛 F Secret Poems 蛇形回路输出
#1632 : Secret Poems 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – ...
- 2015北京网络赛 Couple Trees 倍增算法
2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道. 解法来自 q ...
- 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 ...
随机推荐
- 20145205 《Java程序设计》第7周学习总结
教材学习内容总结 认识时间与日期 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为椭圆形且速度不一,本身自传减速而造成误差. 2.世界时(UT):通过观测远方星体跨过子午线而得,受地球 ...
- sql语句 之聚合函数
聚合分析 在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值.最小值.平均值等.所有这些针对表中一列或者多列数据的分析就称为聚合分析. 在SQL中,可以使用聚合函数快速实现数据的聚 ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码
说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...
- PHP (sendmail / PHPMailer / ezcMailComposer)发送邮件
一. 使用 PHP 内置的 mail() 函数 1. Windows 下 环境:WampServer2.5(Windows 10,Apache 2.4.9,MySQL 5.6.17,PHP 5.5.1 ...
- 使用github的使用,利用git shell命令行模式进行操作
一.登录到git,新建一个版本仓库 二.在"Repository name"一栏里填写版本仓库的名称,如"test",Description栏是描述,可填可不填 ...
- 宿主机远程桌面连接vmware中的虚拟机
参考了:http://jingyan.baidu.com/article/3052f5a1e8c56397f21f8674.html 感谢~ 宿主机安装了vmware,vmware中安装虚拟机,怎 ...
- WordPress忘记登录密码
后台的登录密码使用的是md5加密的,有时候会忘记登录密码,那么可以修改数据库,把密码改为你知道的字符串的md5加密值 如 hello对应的md5加密值为:5d41402abc4b2a76b9719d9 ...
- JMeter学习-032-JMeter常见四种变量简介
在JMeter自动化测试脚本编写过程中,经常需要对测试脚本进行一些参数设置.例如,设置测试计划的全局变量(方便切换不同的测试环境).样本线程(HTTP请求等)的参数传递等. 通常,JMeter中常用的 ...
- angularJs之定时器
$timeout 服务 AngularJS $timeout 服务对应了 JS window.setTimeout 函数. 实例 两秒后显示信息: var app = angular.module(' ...
- LeetCode Paint House II
原题链接在这里:https://leetcode.com/problems/paint-house-ii/ 题目: There are a row of n houses, each house ca ...