【BZOJ 5165】 树上倍增
2024-09-15 12:03:11
【题目链接】
【算法】
树上倍增,时间复杂度 : O(qklog(n))
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 3000010
#define MAXLOG 18
const int INF = 1e8; int T,tot = ,i,x;
char opt[];
int q[MAXN],dep[MAXN],anc[MAXN][MAXLOG]; inline void update(int x)
{
int i;
tot++;
dep[tot] = dep[x] + ;
anc[tot][] = x;
for (i = ; i < MAXLOG; i++) anc[tot][i] = anc[anc[tot][i-]][i-];
}
inline int query(int k)
{
int i,j,t,mn = INF;
bool flag = true;
for (i = ; i <= k; i++) mn = min(mn,dep[q[i]]);
for (i = ; i <= k; i++)
{
t = dep[q[i]] - mn;
for (j = ; j < MAXLOG; j++)
{
if (t & ( << j))
q[i] = anc[q[i]][j];
}
}
for (i = ; i <= k; i++) flag &= (q[i] == q[]);
if (flag) return q[];
for (i = MAXLOG - ; i >= ; i--)
{
flag = true;
for (j = ; j <= k; j++) flag &= (anc[q[j]][i] == anc[q[]][i]);
if (!flag)
{
for (j = ; j <= k; j++) q[j] = anc[q[j]][i];
}
}
return anc[q[]][];
} int main()
{ scanf("%d",&T);
while (T--)
{
scanf("%s%d",&opt,&x);
if (opt[] == 'A') update(x);
else
{
for (i = ; i <= x; i++) scanf("%d",&q[i]);
printf("%d\n",query(x));
}
}
return ;
}
最新文章
- .html(),.text()和.val()的差异总结
- venus java高并发框架
- 基于RESTful标准的Web Api
- 告别node-forever,拥抱PM2
- ASP.NET MVC模型部分验证
- TCP服务端和客户端的框架
- chrome输入框记住密码导致背景黄色的解决方案
- javaScript绑定事件委托 demo
- Mac 下如何使用sed -i命令
- bind、apply与call
- Mybatis实体类属性与数据库字段不一致解决办法
- Hibernate的增删改查(事务)
- 【转】CSS中的浮动和清除浮动
- [Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址
- Centos7修改系统时区
- No module named &#39;pandas._libs.tslib&#39;
- 剑指 offer 面试题31 连续子数组的最大和(动态规划)
- Spring-AOP SpringBoot自动配置和启动Spring AOP
- BZOJ1492 货币兑换 CDQ分治优化DP
- 【ARM】2410裸机系列-uart串口通信