【Vijos】lxhgww的奇思妙想(长链剖分)
题面
给定一棵树,每次询问一个点的\(k\)次祖先,强制在线。
Vijos
题解
长链剖分。
链接暂时咕咕咕了。
现在可以戳链接看题解了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int hson[MAX],dep[MAX],md[MAX],len[MAX];
int p[MAX][20],top[MAX],n,hbit[MAX];
void dfs1(int u,int ff)
{
md[u]=dep[u]=dep[ff]+1;p[u][0]=ff;
for(int i=1;i<20;++i)
if(p[u][i-1])p[u][i]=p[p[u][i-1]][i-1];
else break;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs1(v,u);
if(md[v]>md[hson[u]])hson[u]=v,md[u]=md[v];
}
}
void dfs2(int u,int tp)
{
top[u]=tp;len[u]=md[u]-dep[top[u]]+1;
if(hson[u])dfs2(hson[u],tp);
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=p[u][0]&&e[i].v!=hson[u])
dfs2(e[i].v,e[i].v);
}
vector<int> U[MAX],D[MAX];
int Query(int u,int k)
{
if(k>dep[u])return 0;if(!k)return u;
u=p[u][hbit[k]];k^=1<<hbit[k];
if(!k)return u;
if(dep[u]-dep[top[u]]==k)return top[u];
if(dep[u]-dep[top[u]]>k)return D[top[u]][dep[u]-dep[top[u]]-k-1];
return U[top[u]][k-dep[u]+dep[top[u]]-1];
}
int main()
{
n=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
dfs1(1,0);dfs2(1,1);
for(int i=1;i<=n;++i)
if(i==top[i])
{
int l=0,x=i;
while(l<len[i]&&x)x=p[x][0],++l,U[i].push_back(x);
l=0,x=i;
while(l<len[i])x=hson[x],++l,D[i].push_back(x);
}
int mx=1;
for(int i=1;i<=n;++i)
{
if((i>>mx)&1)++mx;
hbit[i]=mx-1;
}
int m=read(),ans=0;
while(m--)
{
int u=read()^ans,v=read()^ans;
printf("%d\n",ans=Query(u,v));
}
return 0;
}
【Vijos】lxhgww的奇思妙想(长链剖分)的更多相关文章
- [vijos]lxhgww的奇思妙想(长链剖分)
题意 题目链接 Sol 长链剖分 又是一个用各种花式技巧优化的暴力 它的主要思想是:对于每个节点,把深度最深的子节点当做重儿子,它们之间的边当做重边 这样就会有一些非常好的轻质 所有链长总和是\(O( ...
- lxhgww的奇思妙想 长链剖分板子
https://vijos.org/d/Bashu_OIers/p/5a79a3e1d3d8a103be7e2b81 求k级祖先,预处理nlogn,查询o1 //#pragma GCC optimiz ...
- 「vijos-bashu」lxhgww的奇思妙想(长链剖分)
倍增离线,预处理出爹和孙子们.查询\(O(1)\) #include <cstdio> #include <cstring> #include <numeric> ...
- Vijos.lxhgww的奇思妙想(k级祖先 长链剖分)
题目链接 https://blog.bill.moe/long-chain-subdivision-notes/ http://www.cnblogs.com/zzqsblog/p/6700133.h ...
- 2019.01.06 vijos lxhgww的奇思妙想(长链剖分)
传送门 长链剖分模板题. 题意简述:允许O(nlogn)O(nlog_n)O(nlogn)预处理,让你支持O(1)O(1)O(1)查找任意一个点的kkk级祖先. 思路:因为要O(1)O(1)O(1) ...
- 「vijos」lxhgww的奇思妙想(长链剖分)
传送门 长链剖分的板子(又是乱搞优化暴力) 对于每一个点,我们定义它深度最深的子节点为它的重儿子(为什么不叫长儿子……),他们之间的连边为重边 然后长链剖分有几个性质 1.总链长为$O(n)$ 2.一 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...
- BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...
随机推荐
- Django中CBV的执行顺序之源码解析
浅析Django中的CBV的执行顺序 下图为CBV方式的执行顺序,大概执行流程如下: 其中浅蓝色为在假设自己写的类,即Test类中没有dispatch方法的情况下的执行顺序,当自己的类中有dispat ...
- HDU 3947 Assign the task
http://acm.hdu.edu.cn/showproblem.php?pid=3974 Problem Description There is a company that has N emp ...
- C#设计模式之10:状态模式
状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...
- 通过event记录sql
providers EventServiceProvider.php 添加 protected $listen = [ 'Illuminate\Database\Events\QueryExecute ...
- 搭建ELK日志分析系统
看了辣么多博客,就数这个最详细最容易理解了:https://blog.csdn.net/qq_22211217/article/details/80764568 >>>>> ...
- Your branch is ahead of 'origin/master' by 2 commits.
遇到这种问题,表示在你之前已经有2个commit而没有push到远程分支上,所以需要先git push origin **将本地分支提到远程仓库.也可以直接git reset --hard HEAD~ ...
- Linux的基础命令, django的安装与使用
一. Linux一些基础指令 cat命令, 用于查看纯文本文件(常用于内容较少的) cat 校花的故事.txt # 查看文件 cat -n 校花的故事.txt # 查看文件并显示行号 -n 显示行号 ...
- 从 Aliyun 经典网络迁移到 Aliyun VPC 网络
由于阿里云策略问题,要求用户从经典网络中全部迁出,搬迁到他们设置的 VPC 网络中.这里的 VPC 大概指的是逻辑上的一个虚拟局域网.即使是实际上你的机器垮机房在阿里云的不同机房.但是他们仍然能从逻辑 ...
- windows 10 multi virtual desktop keyboard shortcut
windows 10 multi virtual desktop keyboard shortcut windows 10 multi desktop keyboard shortcut https: ...
- 莫烦keras学习自修第五天【CNN卷积神经网络】
1.代码实战 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np np.random.seed(1337) # for r ...