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

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

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

 #include<cstdio>
#include<algorithm>
#define lson ls[x],L,mid
#define rson rs[x],mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
int n,u,v,ans,nd,cnt,tot,lis[N*],lds[N*],ls[N*],rs[N*];
int h[N],to[N<<],nxt[N<<],rt[N],a[N],b[N];
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } int merge(int x,int y){
if (!x || !y) return x|y;
lis[x]=max(lis[x],lis[y]); lds[x]=max(lds[x],lds[y]);
ans=max(ans,max(lis[ls[x]]+lds[rs[y]],lds[rs[x]]+lis[ls[y]]));
ls[x]=merge(ls[x],ls[y]); rs[x]=merge(rs[x],rs[y]); return x;
} void mdf(int &x,int L,int R,int p,int k,int a[]){
if (!x) x=++nd;
a[x]=max(a[x],k); int mid=(L+R)>>;
if (L==R) return;
if (p<=mid) mdf(lson,p,k,a); else mdf(rson,p,k,a);
} int que(int x,int L,int R,int l,int r,int a[]){
if (L==l && r==R) return a[x];
int mid=(L+R)>>;
if (r<=mid) return que(lson,l,r,a);
else if (l>mid) return que(rson,l,r,a);
else return max(que(lson,l,mid,a),que(rson,mid+,r,a));
} void dfs(int x,int fa){
For(i,x) if ((k=to[i])!=fa) dfs(k,x);
int s1=,s2=,t1,t2;
For(i,x) if ((k=to[i])!=fa){
t1=a[x]> ? que(rt[k],,tot,,a[x]-,lis) : ;
t2=a[x]<tot ? que(rt[k],,tot,a[x]+,tot,lds) : ;
rt[x]=merge(rt[x],rt[k]); ans=max(ans,max(s1+t2+,s2+t1+));
s1=max(s1,t1); s2=max(s2,t2);
}
mdf(rt[x],,tot,a[x],s1+,lis); mdf(rt[x],,tot,a[x],s2+,lds);
} int main(){
freopen("490F.in","r",stdin);
freopen("490F.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+); tot=unique(b+,b+n+)-b-;
rep(i,,n) a[i]=lower_bound(b+,b+tot+,a[i])-b;
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(,); printf("%d\n",ans);
return ;
}

[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. vss 日文文件路径的名字在中文系统下乱码

    解决方式:tools-font 文字设置 日本語

  2. win7安装Ubuntu变双系统以及删除Ubuntu分区操作

    Window7系统基础上安装Ubuntu使构成双系统,整个过程如下: 1. 一块空闲磁盘分区准备. “我的电脑”右键 > 管理 > 磁盘管理 > 压缩(从有空余分区压缩)/删除(删除 ...

  3. n个随机变量中第k小值的期望

    Problem 有\(n\)个相互独立的取值在\([0,1]\)的随机变量,问其中第\(k\)小的变量期望是多少? Solution 之前pkuwc的神仙找我换友链,让我受宠若惊.. 我今天突然翻到他 ...

  4. Nodejs 实现ESL内联FreeSWITCH设定说明

    一.背景说明: SIP Server IP (Centos):192.168.11.61  ,服务器IP(Windows):192.168.11.19 二.目的: 能够从192.168.11.19上通 ...

  5. Expm 3_2 寻找最邻近的点对

      [问题描述] 设p1=(x1,y1), p2=(x2,y2), … , pn=(xn,yn) 是平面上n个点构成的集合S,设计和实现找出集合S中距离最近点对的算法. 每一个格子最多只能存在一个点, ...

  6. 错误代码 1045 Access denied for user 'root'@'localhost' (using password:YES)

    1 前言 现象是用MySQL 5.7 Command Line Client可以使用root账号进入,但是其它navicat,phpsqladmin,mysql workbench,heidisql用 ...

  7. 【转载】linux下升级npm以及node

    原文:http://blog.csdn.net/qq_16339527/article/details/73008708 npm升级 废话不多说,直接讲步骤.先从容易的开始,升级npm. npm这款包 ...

  8. js之观察者模式

    观察者模式: 大体上是, 1.松耦合的代码: 2.一对多的关系: 3.主体状态变化时,所有依赖被通知: 4.主体和观察者互不知晓. 基本上,满足上面四点的,就可以算是观察者模式了.来看一个demo, ...

  9. Inno Setup 系列之先卸载之后再安装

    需求使用Inno Setup打包程序之后,很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装,本文的Code就是实现了这样的功能.如果想要在安装前先卸载,那么需要加下面代码,需要注意的是双星号 ...

  10. bzoj2152 树分治

    还是太菜了,自己写的wa,但是找不到哪里错了,, 感觉现在学树分治早了点..以后回来再看吧 /* 多少点对之间的路径是3的倍数 */ #include<iostream> #include ...