浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html

题目传送门:https://www.luogu.org/problemnew/show/P3379

\(st\)表也可以求\(lca\)。在带回溯的\(dfs\)上,两个点的\(lca\)就是在该序列上第一次出现的区间内深度最小的那个点。

至于这个序列有多长,因为每个点会出现度数次,度数总和是\(2*(n-1)\)。

时间复杂度:\(O(nlogn+m)\)

空间复杂度:\(O(nlogn)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=5e5+5; int n,m,rt,tot,cnt;
int f[21][maxn<<1],Log[maxn<<1];
int pos[maxn],dep[maxn],dfn[maxn<<1];
int now[maxn],pre[maxn<<1],son[maxn<<1]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='0')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b;
} void dfs(int fa,int u) {
dep[u]=dep[fa]+1;
pos[u]=++cnt,dfn[cnt]=u,f[0][cnt]=u;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa)dfs(u,v),dfn[++cnt]=u,f[0][cnt]=u;
} int calc(int a,int b) {
return dep[a]<dep[b]?a:b;
} void make_st() {
Log[0]=-1;
for(int i=1;i<=cnt;i++)
Log[i]=Log[i>>1]+1;
for(int i=1;i<=20;i++)
for(int j=1;j+(1<<i)-1<=cnt;j++)
f[i][j]=calc(f[i-1][j],f[i-1][j+(1<<(i-1))]);
} int query(int l,int r) {
int x=Log[r-l+1];
return calc(f[x][l],f[x][r-(1<<x)+1]);
} int main() {
n=read(),m=read(),rt=read();
for(int i=1;i<n;i++) {
int a=read(),b=read();
add(a,b),add(b,a);
}dfs(0,rt);make_st();
for(int i=1;i<=m;i++) {
int a=pos[read()],b=pos[read()];
if(b<a)swap(a,b);
printf("%d\n",query(a,b));
}
return 0;
}

最新文章

  1. angularJS中controller的通信
  2. 【转】 golang slice array
  3. 搭建Windows Azure开发环境-环境搭建
  4. [TypeScript] Generating Definition Files
  5. table 数据少时 ,tr高度变化
  6. 优化大型复杂SQL
  7. 使用md5判断网站内容是否被篡改
  8. 在Livemedia的基础上开发自己的流媒体客户端
  9. c# winform 在一个窗体中使用另一个窗体中TextBox控件的值——解决办法
  10. wamp问题:关于另个php.ini文件的”…
  11. PC端判断浏览器类型及移动端判断移动设备类型
  12. 如何进行PDF页码编排,如何调整PDF页码顺序
  13. Centos查看tomcat状态及操作
  14. IO多路复用版FTP
  15. SQL 一列拆分多行
  16. CF341E Candies Game
  17. Oracle中删除用户下所有对象的多种方法
  18. spark shell学习笔记
  19. 为什么要用Markov chain Monte Carlo (MCMC)
  20. 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化

热门文章

  1. SpringMVC结合REST
  2. javascript中apply和call的区别
  3. Bootstrap学习-菜单-按钮-导航
  4. 我的Android进阶之旅------>Android中android:visibility 属性VISIBLE、INVISIBLE、GONE的区别
  5. 好用的 curl 抓取 页面的封装函数
  6. 在C语言中使用syslog打印日志到日志文件
  7. 【SHARE】WEB前端学习资料
  8. 坑爹的shell 空格
  9. [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解
  10. P4240 毒瘤之神的考验