tree(2018.10.26)
2024-08-24 01:27:09
题意:给你一颗树,树上每个节点都有一个权值,多次询问树上的一条链的严格上升子序列长度
这道题是个神奇的倍增,先记录\(fa[x][0]\)为\(x-root\)路径上第一个权值比他大的点,然后顺便处理出需要跳几步能跳到最靠近根的那个比他大的点(即上升子序列的长度)
对于询问,倍增询问即可。
细节:
1、对于查询路径上第一个权值比他大的点,我们显然只能用\(O(logn)\)的时间,所以我们采用二分查找,可是这条路径上的点并不能保证单调性,所以我们考虑维护一个单调的序列,假设我们对于一个点\(y\)找到路径上第一个权值比他大的点,假设这个点为\(x\),那么对于之后的点,\(x\)后面的那个点就没有价值了,就用\(y\)取代那个点,就好了。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int f[100005][20],top,st[1000005],dep[100005],dis[100005],n,q,cnt,pre[200005],nxt[200005],h[100005],w[100005];
void add(int x,int y)
{
pre[++cnt]=y;nxt[cnt]=h[x];h[x]=cnt;
pre[++cnt]=x;nxt[cnt]=h[y];h[y]=cnt;
}
bool cmp(int a,int b){return w[a]>w[b];}
void dfs(int x,int fa)
{
int ttt=top;top=lower_bound(st+1,st+ttt+1,x,cmp)-st-1;
f[x][0]=st[top++];dis[x]=dis[f[x][0]]+1;int nowid=top,nowval=st[top];st[top]=x;
for(int i=h[x];i;i=nxt[i])if(pre[i]!=fa)dep[pre[i]]=dep[x]+1,dfs(pre[i],x);
st[nowid]=nowval;top=ttt;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),add(x,y);
dep[1]=1;dfs(1,0);
for(int i=1;i<20;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
for(int i=1,x,y,c;i<=q;i++)
{
scanf("%d%d%d",&x,&y,&c);
int p=x;if(c>=w[x]){for(int i=19;i>=0;i--)if(f[p][i]&&w[f[p][i]]<=c)p=f[p][i];p=f[p][0];}
if(dep[p]<dep[y])printf("0\n");
else
{
int s=p;for(int i=19;i>=0;i--)if(dep[f[s][i]]>=dep[y])s=f[s][i];
printf("%d\n",dis[p]-dis[s]+1);
}
}
}
最新文章
- CentOs图形界面的开启与关闭
- 基于MSP430F413水果电池供电的低功耗时钟
- 随堂练习——Rational rose
- (一)Bootstrap简介
- VM 映像 PowerShell 教学系列博客文章
- 它们的定义AlertDialog(二)
- protobuf、LRU、sigleflight
- JAVA线程池的实际运用
- NFV论文集(三)综述
- 关于cmd命令
- react 中的绑定事件
- Python 文件夹及文件操作
- ubuntu 18.04编译opencv3.4.3 with python3.6 cuda9.2 gdal
- HDU - 2604 Queuing(递推式+矩阵快速幂)
- shell變量和數組
- ubuntu配置tomcat和jdk
- 20145326 《Java程序设计》第10周学习总结
- Web中树形数据(层级关系数据)的实现—以行政区树为例
- Ceph添加/删除Mon(ceph.conf)
- unity2017.1.0f3与旧的粒子系统不兼容
热门文章
- 初学php html javascript后小总结
- ABAP读取工单状态 STATUS_READ
- view定位
- 远程请求json数据,list中显示
- linux4 分区
- Python升级已经安装的第三方库
- Codeforces Round #295 (Div. 2)---B. Two Buttons( bfs步数搜索记忆 )
- 【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作
- MAC 地址解析
- [LeetCode] Scramble String -- 三维动态规划的范例