[2020多校联考]树
Solution
(没有定根就非常的离谱,后来告诉根直接就是
先考虑链上怎么做,显然维护一个单调栈,求出第一个比当前数大的位置,然后倍增即可。再放在树上怎么做?依旧维护单调栈,但这次不能暴力地弹掉栈顶元素了,因为这样的复杂度是假的。因为单调栈有单调性,所以直接在单调栈内二分出单调栈弹得不能再弹的位置,然后修改
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100007
inline int read(){
int x=0,flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')flag=0;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return flag? x:-x;
}
struct E{
int next,to;
}e[N<<1];
int head[N],cnt=0;
inline void add(int id,int to){
e[++cnt]=(E){head[id],to};
head[id]=cnt;
}
int sta[N],top=0,w[N],n,Q;
int pre[N][18],dep[N],ans[N];
inline bool Cmp(int x,int y){return w[x]>w[y];}
void dfs(int u,int fa_u){
int lt=top;
top=lower_bound(sta+1,sta+1+lt,u,Cmp)-sta-1;
pre[u][0]=sta[top++];
ans[u]=ans[pre[u][0]]+1;
for(int i=1;i<=17;i++)
pre[u][i]=pre[pre[u][i-1]][i-1];
int lw=sta[top],lpos=top;
sta[top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa_u) continue;
dep[v]=dep[u]+1,dfs(v,u);
}
top=lt,sta[lpos]=lw;
}
int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=read(),Q=read();
for(int i=1;i<=n;i++) w[i]=read();
for(int i=2;i<=n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}
dep[1]=1,dfs(1,0);
while(Q--){
int u=read(),v=read(),c=read();
if(w[u]<=c){
for(int i=17;~i;i--)
if(pre[u][i]&&w[pre[u][i]]<=c) u=pre[u][i];
u=pre[u][0];
}
if(dep[u]<dep[v]) printf("0\n");
else{
int tmp=u;
for(int i=17;~i;i--)
if(dep[pre[u][i]]>=dep[v]) u=pre[u][i];
printf("%d\n",1+ans[tmp]-ans[u]);
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)