社区讨论

WA on test 13好几天了,求调

CF932FEscape Through Leaf参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8ehwgs
此快照首次捕获于
2023/10/27 17:18
2 年前
此快照最后确认于
2023/10/27 17:18
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
#define K(i) b[(i)]
#define X(i) a[(i)]
#define B(i) dp[(i)]
#define Y(x,i) K(i)*x+B(i)
using namespace std;
const int N=1e5+5;
int a[N],b[N],dp[N],rt[N],tag[N*20],ls[N*20],rs[N*20],tot=0;
vector<int> nodes[N];
void modify(int &p,int l,int r,int f)
{
	if(!p)
	{
		p=++tot,tag[p]=f;
		return;
	}
	int &g=tag[p];
	int mid=(l+r)>>1;
	if(Y(mid,f)<Y(mid,g))swap(f,g);
	if(Y(l,f)<Y(l,g))modify(ls[p],l,mid,f);
	if(Y(r,f)<Y(r,g))modify(rs[p],mid+1,r,f);
	return;
}
int query(int p,int l,int r,int x)
{
	if(!p)return LLONG_MAX;
	int mid=(l+r)>>1;
	if(x<=mid)return min(Y(x,tag[p]),query(ls[p],l,mid,x));
	else return min(Y(x,tag[p]),query(rs[p],mid+1,r,x));
}
void merge(int &p1,int p2,int l,int r)
{
	if(!p1||!p2)
	{
		p1|=p2;
		return;
	}
	modify(p1,-N,N,tag[p2]);
	int mid=(l+r)>>1;
	merge(ls[p1],ls[p2],l,mid);
	merge(rs[p1],rs[p2],mid+1,r);
	return;
}
void dfs(int u,int fa)
{
	for(int v:nodes[u])if(v!=fa)dfs(v,u),merge(rt[u],rt[v],-N,N);
	if(rt[u])dp[u]=query(rt[u],-N,N,X(u));
	modify(rt[u],-N,N,u);
	return;
}
signed main()
{
	int n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%lld %lld",&u,&v);
		nodes[u].push_back(v);
		nodes[v].push_back(u);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)printf("%lld ",dp[i]);
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...