题意:给你一颗树,树上每个节点都有一个权值,多次询问树上的一条链的严格上升子序列长度
这道题是个神奇的倍增,先记录\(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); } }
}

转载于:https://www.cnblogs.com/lcxer/p/9865212.html

tree(2018.10.26)相关推荐

  1. 10天精读掌握:计算机组成与设计(COAD:Patterson and Hennessy) (第3天 2018/10.26)

    10天精读掌握:计算机组成与设计COAD:Patterson and Hennessy 第3天 2018/10.26 1. 第4次周计划概览 2. 今日学习成果 今日成果简述 今日笔记 3. 今日时间 ...

  2. 【一周头条盘点】中国软件网(2018.10.22~2018.10.26)

    每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 一周热点 微软发布"创纪录"的Q1财报:营收291亿美元 净利同比增34% 10月25日,微软发布了20 ...

  3. 2018.10.26 酷狗音乐校招前端一面经历(转)

    酷狗一面 1. 如何实现三栏布局(左右两边固定宽度,中间自适应)? 使用flex布局: 父元素设置 display: flex,左右两边设置固定宽度,中间设置 flex-grow: 1: 使用浮动布局 ...

  4. 2018.10.26多校

    T1:这道题虽然是今天最简单的,但是我依然没想出来... 链接:tree T2,T3过于毒瘤,留坑 转载于:https://www.cnblogs.com/lcxer/p/9865214.html

  5. 2018.10.26 NOIP模拟 瓶子 (dp/贪心)

    传送门 正解是dp并不想去想了. 自己yy了一个贪心拿了95pts95pts95pts,唯一没过的点还只有一个地方错了,面向数据变成之后过啦! 所以我讲讲如何贪心. 考虑到最后都只会合并成一种颜色,所 ...

  6. 《惢客创业日记》2018.10.26(周五) 健康=小米MIX3

    今天,接着把昨天没有写完的日记补完,重点说说我和这个中医关于惢客的话题.虽然他不懂互联网,对手机的了解程度也仅仅停留在使用微信的层面.但是,他的很多问题还是很犀利的. 他的第一个问题是:"小 ...

  7. 2018.12.26 作业

    作业链接:https://pan.baidu.com/s/1wdO5CIBgM3fJW8xAUI2Ajg 提取码:u8qr 一.笔记 选择结构:Java提供了if控制语句和switch控制语句来实现. ...

  8. 2018.7.26 为RapidMiner5进行插件扩展(extension)开发

    注意:RapidMiner5和RapidMiner6+采用的插件扩展(extension)开发方式不同. 1 官方资料 1.1 extension开发文档 https://rapidminer.com ...

  9. 成都市等2009年《四川省建设工程清单计价定额》人工费调整批复〔2018〕26号

    四川省建设工程造价管理总站 川建价发[2018]26号 四川省建设工程造价管理总站 关于对成都市等13个市.州 2009年<四川省建设工程工程量清单计价定额> 人工费调整的批复 各有关市. ...

最新文章

  1. vue main.js 引入 全局 js 统一导入 js
  2. 爱奇艺谢丹铭:用AI让创作者提升效率,让消费者简单快乐丨MEET2021
  3. iPod/iTouch/ipad/iPhone新手注意事项
  4. sql跨表查询_跨表查询经常有,何为跨表更新?
  5. Hibernate 的Set、List、Map集合操作(添加,修改,查询)
  6. linux 笔记--系统启动流程
  7. IDEA 搭建 SpringBoot + Maven + Oracle + Hibernate 项目框架
  8. 【C语言】输入一个整数x并判断x是否存在于数组a中
  9. Linux下安装Nexus-3.15私服
  10. android文本后面显示按钮,按下按钮后显示文本android
  11. [转]JS弹出div和关闭
  12. CMM3标准体系项目管理
  13. 文本自动生成研究进展与趋势之总结与展望
  14. 以作回顾、以作借鉴、以作鼓励
  15. Go 每日一库之 testify
  16. 小程序获取微信的版本号
  17. 【Qt】Use multi-arg instead
  18. linux 挂载 SD 卡
  19. 中级职称评审的条件和流程
  20. RK3188 datasheet,RK3188数据手册,RK3188芯片参考

热门文章

  1. c#用canny算子做边缘提取_干货 | 边缘检测
  2. Python 正则表达式(一)
  3. C_C++编程题:选择填空、智力题
  4. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  5. python程序设计基础第三版_Python程序设计(第三版)PPT及源码
  6. PHP地图规划骑行路径,骑行路线规划
  7. emmc linux 识别分区_linux下给U盘分区并制作文件系统
  8. eclipse里source的快捷方法_教你如何在Linux中设置快捷方式图标
  9. mysql join 循环_MySQL的JOIN(三):JOIN优化实践之内循环的次数
  10. 编程利器 Beyond Compare 的使用