这写个老树剖咋还能MLE呢?
  • 板块P4114 Qtree1
  • 楼主DYYqwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/16 08:59
  • 上次更新2024/10/16 09:30:46
查看原帖
这写个老树剖咋还能MLE呢?
719978
DYYqwq楼主2024/10/16 08:59

rt。自己算过空间了,大概11.5M,我觉得没啥问题/fn

#include<bits/stdc++.h>
#define int long long
#define lson(root) (root << 1)
#define rson(root) (root << 1 | 1)
using namespace std;
struct node
{
	int to , nxt , w;
}e[200010];
struct edge
{
	int mx;
}tree[400010];
int n , tot , head[100010] , a[100010] , dep[100010] , fa[100010] , son[100010] , sz[100010] , dfn[100010] , cnt , rk[100010] , tp[100010];
void add(int u , int v , int w)
{
	++ tot;
	e[tot].to = v;
	e[tot].nxt = head[u];
	e[tot].w = w;
	head[u] = tot;
}
void dfs1(int u , int pa)
{
	dep[u] = dep[pa] + 1 , fa[u] = pa , sz[u] = 1;
	for(int i = head[u] ; i != 0 ; i = e[i].nxt)
	{
		int v = e[i].to;
		if(v == pa) continue;
		dfs1(v , u);
		sz[u] += sz[v];
		if(sz[v] > sz[son[u]]) son[u] = v;
	}
}
void dfs2(int u , int tp_fa)
{
	dfn[u] = ++ cnt , rk[cnt] = u , tp[u] = tp_fa;
	if(son[u]) dfs2(son[u] , tp_fa);
	for(int i = head[u] ; i != 0 ; i = e[i].nxt)
	{
		int v = e[i].to;
		if(v == fa[u] || v == son[u]) continue;
		dfs2(v , v);
	}
}
void dfs_down(int u , int pa)
{
	for(int i = head[u] ; i != 0 ; i = e[i].nxt)
	{
		int v = e[i].to;
		if(v == pa) continue;
		a[v] = e[i].w;
		dfs_down(v , u);
	}
}
void pushup(int root)
{
	tree[root].mx = max(tree[lson(root)].mx , tree[rson(root)].mx);
}
void update(int root , int l , int r , int x , int y)
{
	if(l == r)
	{
		tree[root].mx = y;
		return;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) update(lson(root) , l , mid , x , y);
	else update(rson(root) , mid + 1 , r , x , y);
	pushup(root);
}
int query(int root , int l , int r , int L , int R)
{
	if(L <= l && R >= r) return tree[root].mx;
	int mid = (l + r) >> 1 , ans = 0;
	if(L <= mid) ans = max(ans , query(lson(root) , l , mid , L , R));
	if(R > mid) ans = max(ans , query(rson(root) , mid + 1 , r , L , R));
	return ans;
}
void build(int root , int l , int r)
{
	if(l == r)
	{
		tree[root].mx = a[rk[l]];
		return;
	}
	int mid = (l + r) >> 1;
	build(lson(root) , l , mid);
	build(rson(root) , mid + 1 , r);
	pushup(root);
}
int uv_query(int u , int v)
{
	int ans = 0;
	while(tp[u] != tp[v])
	{
		if(dep[tp[u]] < dep[tp[u]]) swap(u , v);
		ans = max(ans , query(1 , 1 , n , dfn[tp[u]] , dfn[u]));
		u = fa[tp[u]];
	}
	if(dep[u] < dep[v]) swap(u , v);
	ans = max(ans , query(1 , 1 , n , dfn[v] , dfn[u]));
	return ans;
}
signed main()
{
	scanf("%lld" , &n);
	for(int i = 1 , u , v , w ; i < n ; i ++) scanf("%lld%lld%lld" , &u , &v , &w) , add(u , v , w) , add(v , u , w);
	dfs1(1 , 0) , dfs2(1 , 1) , dfs_down(1 , 0);
	build(1 , 1 , n);
	string s;
	while(cin >> s && s != "DONE")
	{
		int x , y;
		scanf("%lld%lld" , &x , &y);
		if(s == "CHANGE") update(1 , 1 , n , x , y);
		else printf("%lld\n" , (x == y) ? 0 : uv_query(x , y));
	}
	return 0;
}
2024/10/16 08:59
加载中...