题目链接:点击打开链接

题意:

给定n个点的树。

以下n个数表示点权。

以下n-1行给出树。

找一条链,然后找出这条链中的点权组成的最长上升子序列。

求:最长上升子序列的长度。

思路:

首先是维护一条链然后求答案。可是假设直接树形dp(记录每一个点u,u往下递增和u往下递减的长度)会使序列是来回的,即递增和递减都在同一条链上。

枚举每一个点作为子序列的开头,然后维护一条链进行LIS的nlogn做法。

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet; public class Main {
int max(int x, int y) {
return x > y ? x : y;
}
static int N = 6050;
int[] a = new int[N], len = new int[N];
int n;
int ans;
ArrayList<Integer>[] G = new ArrayList[N];
int[] Stack = new int[N];
int top;
void find(int u, int fa) {
int pos = -1, val = -1;
if(a[u]>Stack[top-1]){
pos = -2;//-2表示新加了一个元素
Stack[top++] = a[u];
ans = max(ans, top);
}
else
{
int l = 0, r = top-1, siz = 0;
while(l <= r){
int mid = (l+r)>>1;
if(Stack[mid] < a[u])
l = mid+1;
else
{
r = mid-1;
siz = mid;
}
}
pos = siz; val = Stack[siz];
Stack[pos] = a[u];
}
for(int i = 0; i < G[u].size(); i++){
int v = G[u].get(i); if(v == fa)continue;
find(v, u);
}
if(pos != -1){
if(pos == -2)top--;
else {
Stack[pos] = val;
}
}
}
void solve(int u) {
for(int i = 0; i < G[u].size(); i++){
int v = G[u].get(i);
top = 0;
Stack[top++] = a[u];
find(v, u);
}
} void input() {
n = cin.nextInt();
for (int i = 1; i <= n; i++) {
G[i] = new ArrayList();
a[i] = cin.nextInt();
}
for (int i = 1, u, v; i < n; i++) {
u = cin.nextInt();
v = cin.nextInt();
G[u].add(v);
G[v].add(u);
}
} public void work() {
input();
ans = 1;
for (int i = 1; i <= n; i++)
solve(i);
out.println(ans);
} Main() {
cin = new Scanner(System.in);
out = new PrintWriter(System.out);
} public static void main(String[] args) {
Main e = new Main();
e.work();
out.close();
} public Scanner cin;
public static PrintWriter out;
}

Codeforces 490F Treeland Tour 树上的最长上升子序列的更多相关文章

  1. Codeforces 490F Treeland Tour(离散化 + 线段树合并)

    题目链接 Treeland Tour 题目就是让你求树上LIS 先离散化,然后再线段树上操作.一些细节需要注意一下. #include <bits/stdc++.h> using name ...

  2. Codeforces 490F. Treeland Tour 暴力+LIS

    枚举根+dfs 它可以活 , 我不知道有什么解决的办法是积极的 ...... F. Treeland Tour time limit per test 5 seconds memory limit p ...

  3. Codeforces 490F Treeland Tour 树形dp

    Treeland Tour 离散化之后, 每个节点维护上升链和下降链, 感觉复杂度有点高, 为啥跑这么快.. #include<bits/stdc++.h> #define LL long ...

  4. cf 290F. Treeland Tour 最长上升子序列 + 树的回溯 难度:1

    F. Treeland Tour time limit per test 5 seconds memory limit per test 256 megabytes input standard in ...

  5. codeforces mysterious present 最长上升子序列+倒序打印路径

    link:http://codeforces.com/problemset/problem/4/D #include <iostream> #include <cstdio> ...

  6. Codeforces 667D World Tour 最短路

    链接 Codeforces 667D World Tour 题意 给你一个有向稀疏图,3000个点,5000条边. 问选出4个点A,B,C,D 使得 A-B, B-C, C-D 的最短路之和最大. 思 ...

  7. 【UOJ#33】【UR #2】树上GCD(长链剖分,分块)

    [UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵 ...

  8. codeforces E. The Contest(最长上升子序列)

    题目链接:https://codeforces.com/contest/1257/problem/E 题意:给三个序列k1,k2,k3,每个序列有一堆数,k1是前缀,k3是后缀,k2是中间,现可以从任 ...

  9. Codeforces Global Round 11 C. The Hard Work of Paparazzi(dp/最长上升子序列)

    题目链接:https://codeforces.com/contest/1427/problem/C 题意 \(r\) 行与 \(r\) 列相交形成了 \(r \times r\) 个点,初始时刻记者 ...

随机推荐

  1. 项目记事【多线程】:关于 SimpledDateFormat 的多线程问题

    背景: 最近项目引入了 SonarLink,解决代码规范的问题,在检查历史代码的时候,发现了一个问题. 先看代码: public class DateUtil { private static fin ...

  2. Codeforces 891 C Envy

    题目大意 给定一个 $n$ 个点 $m$ 条边的连通的无向图,每条边有一个权值,可能有重边.给出 $q$ 组询问,一组询问给出 $k$ 条边,问是否存在一棵最小生成树包含这 $k$ 条边. 思路 这道 ...

  3. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)

    一.下文中需要的资源地址汇总 Maven Apache Maven网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/down ...

  5. 【NOIP2016练习】T1 挖金矿(二分答案)

    题意: 思路:二分答案A 合法的答案 sigma(s[i][xi])/sigma(xi)>=a i<=m sigma(s[i][xi]-a*xi)>=0 对于每个i找到xi使s[i] ...

  6. hdu 4932 BestCoder Round #4 1002

    这题真是丧心病狂,引来今天的hack狂潮~ Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  7. 标准C程序设计七---103

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  8. 27深入理解C指针之---字符串基础

    一.字符串:是以ASCII字符NUL结尾的字符序列,NUL表示为\0 1.定义:将字符按顺序存储在数组中,以NUL结尾. 2.特征: 1).每个字符串长度只是包含所有的字符,不包括最后的NUL,手动分 ...

  9. mysql into outfile 导出

    <sql> into outfile 'xxx.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; <sql> 表示 ...

  10. String()和.toString()的区别

    一.相同点:都可以转为字符串类型: 二.不同点: 1..toString() :null.toString()和undefined.toString() 程序报错误; 2..toString(): . ...