C++->C
查看原帖
C++->C
507374
sqrtqwq楼主2024/1/15 19:16
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100003;
int n,cnt;
int w[maxn],dson[maxn],siz[maxn],f[maxn],dep[maxn];
int top[maxn],b[maxn],id[maxn];

namespace Seg
{
	int a[maxn << 2],mx[maxn << 2];
	#define ls p << 1
	#define rs p << 1 | 1
	void pushup(int p)
	{
		a[p] = a[ls] + a[rs];
		mx[p] = max(mx[ls],mx[rs]);
	}
	void build(int p,int l,int r)
	{
		if(l == r)
		{
			a[p] = mx[p] = w[l];
			return ;
		}
		int mid = l + r >> 1;
		build(ls,l,mid);
		build(rs,mid + 1,r);
		pushup(p);
	}
	void update(int p,int l,int r,int k,int v)
	{
		if(l == r)
		{
			a[p] = mx[p] = v;
			return ;
		}
		int mid = l + r >> 1;
		if(k <= mid)
		{
			update(ls,l,mid,k,v);
		}
		else
		{
			update(rs,mid + 1,r,k,v);
		}
		pushup(p);
	}
	int query(int p,int l,int r,int nl,int nr)
	{
		if(nl <= l && r <= nr)
		{
			return mx[p];
		}
		int res = -0x3f3f3f3f;
		int mid = l + r >> 1;
		if(nl <= mid)
		{
			res = max(res,query(ls,l,mid,nl,nr));
		}
		if(nr > mid)
		{
			res = max(res,query(rs,mid + 1,r,nl,nr));
		}
		return res;
	}
}using namespace Seg;

struct edge
{
	int nxt,to,w;
}e[maxn << 1];
int head[maxn],tot;
void add_edge(int u,int v,int w)
{
	e[++tot].nxt = head[u];
	head[u] = tot;
	e[tot].to = v;
	e[tot].w = w;
}//建边 

struct node
{
	int u,v,w;
}E[maxn];

void dfs1(int u,int fa,int d)//节点,父亲,深度 
{
	f[u] = fa;
    dep[u] = d;
    siz[u] = 1;
	for(int i = head[u];i;i = e[i].nxt)
	{
        int v = e[i].to;//儿子节点 
		if(v == fa)
        {
        	b[u] = e[i].w;
            continue;
        }
		dfs1(v,u,d + 1);
		siz[u] += siz[v];
		if (siz[v] > siz[dson[u]])
        {
            dson[u] = v;
        }//重儿子 
	}
	return;
}

inline void dfs2(int u,int fa)
{
    top[u] = fa;
    id[u] = ++cnt;
    w[cnt] = b[u];
	if (!dson[u])
    {
        return;
    }
	dfs2(dson[u],fa);
	for(int i = head[u];i;i = e[i].nxt)
    {
        int v = e[i].to;
		if(v != f[u] && v != dson[u])
        {
            dfs2(v,v);
        }
    }
	return;
}//树剖

int pathMax(int u,int v)
{
	int res = -0x3f3f3f3f;
	while(top[u] != top[v])
	{
		if(dep[top[u]] < dep[top[v]])
		{
			swap(u,v);
		}
		res = max(res,query(1,1,n,id[top[u]],id[u]));
		u = f[top[u]];
	}
	if(dep[u] > dep[v])
	{
		swap(u,v);
	}
	res = max(res,query(1,1,n,id[u] + 1,id[v]));
	return res;
}
void init()
{
    memset(head,0,sizeof(head));
    tot = 0;
    memset(a,0,sizeof(a));
    memset(mx,0,sizeof(mx));
    memset(siz,0,sizeof(siz));
    memset(dson,0,sizeof(dson));
}
void solve()
{
    cin >> n;
	for(int i = 1;i < n;i++)
	{
		int u,v,w;
		cin >> u >> v >> w;
		add_edge(u,v,w);
		add_edge(v,u,w);
		E[i] = {u,v,w};
	}
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,1,n);
	string str;
	cin >> str;
	while(1)
	{
		if(str == "DONE")
		{
			break;
		}
		int u,v;
		cin >> u >> v;
		if(str == "QUERY")
		{
			if(u != v)
			{
				cout << pathMax(u,v) << '\n';
			}
			else
			{
				cout << 0 << '\n';
			}
		}
		else
		{
			if(dep[E[u].u] > dep[E[u].v])
			{
				u = E[u].u;
			}
			else
			{
				u = E[u].v;
			}
			update(1,1,n,id[u],v);
		}
		cin >> str; 
	}
}
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
	    solve();
	}
    return 0;
}
/*
10
1 2 2
1 4 3
1 5 8
2 3 5
2 6 10
4 7 9
6 9 6
7 8 9
7 10 2
CHANGE 7 8
CHANGE 3 5
QUERY 3 9
CHANGE 2 9
QUERY 3 5
QUERY 1 4
QUERY 4 1
CHANGE 4 2
CHANGE 5 6
DONE

*/
2024/1/15 19:16
加载中...