MnZn初学树上dp,n2logn算法求助
查看原帖
MnZn初学树上dp,n2logn算法求助
317752
竹取颱楼主2021/10/4 11:30

RT

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N = 6010;
long long n, a[N], f[N], ans, k, u, v, tmp, head[N], tot;
struct edge {
	int to, nxt;
}; edge g[N << 1];
template<typename T>
inline void read(T& x)
{
	x = 0;
	register int f = 1;
	register char c = getchar();
	while (c < '0' || c>'9')
	{
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	x *= f;
}
template<typename T>
void write(T x)
{
	if (x < 0)
	{
		putchar('-');
		x = ~x + 1;
	}
	if (x >= 10) write(x / 10);
	putchar(x % 10 ^ 48);
}
inline void add(int u, int v)
{
	g[++tot].to = v;
	g[tot].nxt = head[u];
	head[u] = tot;
}
void dfs(int o, int fa)
{
	k = lower_bound(f + 1, f + n + 1, a[o]) - f;
	ans = max(ans, k); tmp = f[k]; f[k] = a[o];
	for (int i = head[o]; i; i = g[i].nxt)
	{
		v = g[i].to;
		if (v != fa) dfs(v, o);
	}
	f[k] = tmp;
}
int main()
{
	read(n);
	for (int i = 1; i <= n; ++i)
		read(a[i]);
	for (int i = 1; i < n; ++i)
	{
		read(u); read(v);
		add(u, v);
		add(v, u);
	}
	memset(f, 0x3f3f3f3f, sizeof(f));
	for (int i = 1; i <= n; ++i)
		dfs(i, 0);
	write(ans);
	return 0;
}
2021/10/4 11:30
加载中...