社区讨论
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 条回复,欢迎继续交流。
正在加载回复...