树上LIS:树上找一条简单路径的子序列使点权严格单增,最大化长度。

原题数据过小,用线段树合并可以做到$O(n\log n)$。

每个点用一棵线段树维护以每个权值为结尾的LIS最长长度,线段树合并时更新子序列不包含当前点时的最大值,再线段树上区间询问得到包含时的最大值并更新线段树。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define lson ls[x],L,mid
  4. #define rson rs[x],mid+1,R
  5. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  6. #define For(i,x) for (int i=h[x],k; i; i=nxt[i])
  7. using namespace std;
  8.  
  9. const int N=;
  10. int n,u,v,ans,nd,cnt,tot,lis[N*],lds[N*],ls[N*],rs[N*];
  11. int h[N],to[N<<],nxt[N<<],rt[N],a[N],b[N];
  12. void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
  13.  
  14. int merge(int x,int y){
  15. if (!x || !y) return x|y;
  16. lis[x]=max(lis[x],lis[y]); lds[x]=max(lds[x],lds[y]);
  17. ans=max(ans,max(lis[ls[x]]+lds[rs[y]],lds[rs[x]]+lis[ls[y]]));
  18. ls[x]=merge(ls[x],ls[y]); rs[x]=merge(rs[x],rs[y]); return x;
  19. }
  20.  
  21. void mdf(int &x,int L,int R,int p,int k,int a[]){
  22. if (!x) x=++nd;
  23. a[x]=max(a[x],k); int mid=(L+R)>>;
  24. if (L==R) return;
  25. if (p<=mid) mdf(lson,p,k,a); else mdf(rson,p,k,a);
  26. }
  27.  
  28. int que(int x,int L,int R,int l,int r,int a[]){
  29. if (L==l && r==R) return a[x];
  30. int mid=(L+R)>>;
  31. if (r<=mid) return que(lson,l,r,a);
  32. else if (l>mid) return que(rson,l,r,a);
  33. else return max(que(lson,l,mid,a),que(rson,mid+,r,a));
  34. }
  35.  
  36. void dfs(int x,int fa){
  37. For(i,x) if ((k=to[i])!=fa) dfs(k,x);
  38. int s1=,s2=,t1,t2;
  39. For(i,x) if ((k=to[i])!=fa){
  40. t1=a[x]> ? que(rt[k],,tot,,a[x]-,lis) : ;
  41. t2=a[x]<tot ? que(rt[k],,tot,a[x]+,tot,lds) : ;
  42. rt[x]=merge(rt[x],rt[k]); ans=max(ans,max(s1+t2+,s2+t1+));
  43. s1=max(s1,t1); s2=max(s2,t2);
  44. }
  45. mdf(rt[x],,tot,a[x],s1+,lis); mdf(rt[x],,tot,a[x],s2+,lds);
  46. }
  47.  
  48. int main(){
  49. freopen("490F.in","r",stdin);
  50. freopen("490F.out","w",stdout);
  51. scanf("%d",&n);
  52. rep(i,,n) scanf("%d",&a[i]),b[i]=a[i];
  53. sort(b+,b+n+); tot=unique(b+,b+n+)-b-;
  54. rep(i,,n) a[i]=lower_bound(b+,b+tot+,a[i])-b;
  55. rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
  56. dfs(,); printf("%d\n",ans);
  57. return ;
  58. }

[CF490F]Treeland Tour(线段树合并)的更多相关文章

  1. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

  2. [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

  3. BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )

    路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...

  4. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

    [bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...

  6. bzoj3702二叉树 线段树合并

    3702: 二叉树 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 600  Solved: 272[Submit][Status][Discuss] ...

  7. BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...

  8. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  9. BZOJ_3307_雨天的尾巴_线段树合并+树上差分

    BZOJ_3307_雨天的尾巴_线段树合并 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后 ...

随机推荐

  1. Faster rcnn代码理解(1)

    这段时间看了不少论文,回头看看,感觉还是有必要将Faster rcnn的源码理解一下,毕竟后来很多方法都和它有相近之处,同时理解该框架也有助于以后自己修改和编写自己的框架.好的开始吧- 这里我们跟着F ...

  2. PCA主成分分析+白化

    参考链接:http://deeplearning.stanford.edu/wiki/index.php/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90 h ...

  3. springboot系列十三、springboot集成swaggerUI

    一.Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. ...

  4. jrockit静默安装笔记

    操作系统安装版本:CentOS-6.4-i386-minimal JDK安装版本:jrockit-jdk1.6.0_20-R28.1.0-4.0.1-linux-ia32 1.通过SecureFX工具 ...

  5. 【转】深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 这篇博文介绍一款开源的JMS具体实现——ActiveMQ.ActiveMQ ...

  6. SharePoint 2013 Workflow Manager 1.0 远程服务器返回错误: (400) 错误的请求。 不支持查询字符串中的 api-version

    环境: Windows Server 2012 R2 Standard SharePoint Server 2013 with sp1 通过Web 平台安装程序 5.0,已安装 Workflow Ma ...

  7. oracle instantclient_11_2 配置文件tnsnames.ora

    文件所在位置(不同版本位置可能不同): oracle\product\10.2.0\client_1\NETWORK\ADMIN\tnsnames.ora WDDB = (DESCRIPTION = ...

  8. zabbix3.0.4关于java服务端程序内存溢出的处理

    关于java服务端程序内存溢出的处理 java服务端程序内存溢出会产生jvm.log文件,此时程序会挂掉,无法正常处理业务,需要重启服务 思路: 当存在jvm.log这个文件的时候则触发clean_j ...

  9. zabbix系列(二)zabbix3.0.4添加对mysql数据库性能的监控

    zabbix3.0.4添加Mysql的监控 zabbix3.0 server已自带mysql的模板了,只需安装agent端,然后在web端给主机增加模板就行了. Agent端操纵 /etc/zabbi ...

  10. Ex 6_17 数量无限的硬币兑换问题_第七次作业

    子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i. 递归关系: 初值设定:设b[0]=true 求解顺序:按下标从 ...