怎么就我8个点MLE
查看原帖
怎么就我8个点MLE
286571
Crane_NF楼主2024/8/1 16:59

A了5和6,其他M

这

#include<bits/stdc++.h>
using namespace std;
typedef short int si;
const si N = 30010;
si idx,nxt[N * 2],d[N * 2],h[N * 2];
si dep[N],top[N],fa[N],son[N],siz[N];
si dfn[N],wz[N],d1,w[N];
struct nd
{
	si sum;
	si maxn;
}tree[N * 2];
si n,m,s;
void add(si x,si y)
{
	idx++;
	d[idx] = y;
	nxt[idx] = h[x];
	h[x] = idx;
}
void dfs(si x,si deep,si da)
{
	fa[x] = da;
	dep[x] = deep;
	si gs = 1;
	for(si i = h[x];i;i = nxt[i])
	{
		if(d[i] == da)
			continue;
		dfs(d[i],deep + 1,x);
		gs += siz[d[i]];
		if(siz[d[i]] > siz[son[x]])
			son[x] = d[i];
	}
	siz[x] = gs;
}
void dfs1(si x,si to)
{
	top[x] = to;
	if(!son[x])
		return ;
	dfn[++d1] = son[x];
	wz[son[x]] = d1;
	dfs1(son[x],to);
	for(si i = h[x];i;i = nxt[i])
	{
		if(d[i] == fa[x] || d[i] == son[x])
			continue;
		dfn[++d1] = d[i];
		wz[d[i]] = d1;
		dfs1(d[i],d[i]);
	}
}
void build(si now,si l,si r)
{
	if(l == r)
	{
		tree[now].sum = tree[now].maxn = w[dfn[l]];
		return ;
	}
	if(l > r)
		return ;
	si mid = (l + r) >> 1;
	build(now * 2,l,mid);
	build(now * 2 + 1,mid + 1,r);
	tree[now].maxn = max(tree[now * 2].maxn,tree[now * 2 + 1].maxn);
	tree[now].sum = tree[now * 2].sum + tree[now * 2 + 1].sum;
}
void change(si now,si l,si r,si aim,si num)
{
	if(l == r && l == wz[aim])
	{
		tree[now].sum = tree[now].maxn = num;
		return ;
	}
	if(l > r)
		return ;
	si mid = (l + r) >> 1;
	if(aim <= mid)
		change(now * 2,l,mid,aim,num);
	else
		change(now * 2 + 1,mid + 1,r,aim,num);
	tree[now].maxn = max(tree[now * 2].maxn,tree[now * 2 + 1].maxn);
	tree[now].sum = tree[now * 2].sum + tree[now * 2 + 1].sum;
}
si find_ma(si now,si l,si r,si al,si ar)
{
	if(al <= l && r <= ar)
		return tree[now].maxn;
	if(ar < l || r < al)
		return -32000;
	si mid = (l + r) >> 1;
	return max(find_ma(now * 2,l,mid,al,ar),find_ma(now * 2 + 1,mid + 1,r,al,ar));
}
si find_su(si now,si l,si r,si al,si ar)
{
	if(al <= l && r <= ar)
		return tree[now].sum;
	if(ar < l || r < al)
		return 0;
	si mid = (l + r) >> 1;
	return find_su(now * 2,l,mid,al,ar) + find_su(now * 2 + 1,mid + 1,r,al,ar);
}
si ask_max(si x,si y)
{
	si ans = -INT_MAX;
	while(top[x] != top[y])
	{
		if(dep[top[x]] < dep[top[y]])
			swap(x,y);
		ans = max(ans,find_ma(s,1,n,wz[top[x]],wz[x]));
		x = fa[top[x]];
	}
	if(dep[x] > dep[y])
		swap(x,y);
	ans = max(ans,find_ma(s,1,n,wz[x],wz[y]));
	return ans;
}
si ask_sum(si x,si y)
{
	si ans = 0;
	while(top[x] != top[y])
	{
		if(dep[top[x]] < dep[top[y]])
			swap(x,y);
		ans += find_su(s,1,n,wz[top[x]],wz[x]);
		x = fa[top[x]];
	}
	if(dep[x] > dep[y])
		swap(x,y);
	ans += find_su(s,1,n,wz[x],wz[y]);
	return ans;
}
int main()
{
	si t,t1;
	cin >> n;
	s = 1;
	for(si i = 1;i < n;i++)
	{
		scanf("%d %d",&t,&t1);
		add(t,t1);
		add(t1,t);
	}
	for(si i = 1;i <= n;i++)
		scanf("%d",&w[i]);
	dfs(s,1,0);
	dfn[++d1] = s;
	wz[s] = d1;
	dfs1(s,s);
//	for(si i = 1;i <= n;i++)
//		cout << wz[i] << " ";
//	return 0;
	build(1,1,n);
	cin >> m;
	string tt;
	for(si i = 1;i <= m;i++)
	{
		cin >> tt;
		scanf("%d %d",&t,&t1);
		switch(tt[1])
		{
			case 'H':
				change(1,1,n,wz[t],t1);
				break;
			case 'M':
				printf("%d\n",ask_max(t,t1));
				break;
			case 'S':
				printf("%d\n",ask_sum(t,t1));
				break;
		}
	}
	return 0;
}

到底为什么啊啊啊啊我又不是m

2024/8/1 16:59
加载中...