1 条题解
-
0
#include<bits/stdc++.h> #define lc (p<<1) #define rc (lc|1) #define mid (l+r>>1) using namespace std; const int N=1e5+5; int n,Q,md,k[N],l[N],r[N],siz[N],d[N],fa[N],son[N],top[N],id[N],p[N],rt[N<<1],num; long long b[N],ans[N]; vector<int> e[N]; vector<pair<int,int>> v[N<<2],f[N]; struct SegT{ int K[N<<7],ls[N<<7],rs[N<<7],cnt; long long B[N<<7]; #define f(x) (1ll*K[p]*x+B[p]) #define F(x) (1ll*K[q]*x+B[q]) #define g(x) (1ll*k*x+b) void modify(int k,long long b,int &p,int l,int r){ if(!p)p=++cnt; if(f(l)>=g(l)&&f(r)>=g(r))return; if(f(l)<=g(l)&&f(r)<=g(r))return K[p]=k,B[p]=b,void(); if(g(mid)>f(mid))swap(K[p],k),swap(B[p],b); k<K[p]?modify(k,b,ls[p],l,mid):modify(k,b,rs[p],mid+1,r); } void insert(int k,long long b,int L,int R,int &p,int l=0,int r=1e6){ if(!p)p=++cnt; if(L<=l&&r<=R)return modify(k,b,p,l,r); if(L<=mid)insert(k,b,L,R,ls[p],l,mid); if(R>mid)insert(k,b,L,R,rs[p],mid+1,r); } int merge(int p,int q,int l=0,int r=1e6){ if(!p||!q)return p+q; if(l==r)return f(mid)>=F(mid)?p:q; return ls[p]=merge(ls[p],ls[q],l,mid),rs[p]=merge(rs[p],rs[q],mid+1,r),modify(K[q],B[q],p,l,r),p; } long long ask(int x,int p,int l=0,int r=1e6){return l==r?f(x):max(f(x),x<=mid?ask(x,ls[p],l,mid):ask(x,rs[p],mid+1,r));} }t; void dfs(int x){ siz[x]=1; for(int y:e[x])if(y!=fa[x]){ fa[y]=x,d[y]=d[x]+1,dfs(y),siz[x]+=siz[y]; if(siz[y]>siz[son[x]])son[x]=y; } } void dfs(int x,int tp){ id[x]=++num,t.insert(k[x],b[x],l[x],r[x],rt[num]),top[x]=tp; if(son[x])dfs(son[x],tp); for(int y:e[x])if(y!=fa[x]&&y!=son[x])dfs(y,y); } void add(int L,int R,int id,int x,int p=1,int l=1,int r=n){ if(L<=l&&r<=R)return v[p].emplace_back(id,x),void(); if(L<=mid)add(L,R,id,x,lc,l,mid); if(R>mid)add(L,R,id,x,rc,mid+1,r); } void calc1(int x){ t.insert(k[x],b[x],l[x],r[x],rt[n+top[x]]); for(auto [id,z]:f[x])ans[id]=max(ans[id],t.ask(z,rt[n+top[x]])); for(int y:e[x])if(y!=fa[x])calc1(y); } void calc2(int p=1,int l=1,int r=n){ if(l<r)calc2(lc,l,mid),calc2(rc,mid+1,r),rt[l]=t.merge(rt[l],rt[mid+1]); for(auto [id,x]:v[p])ans[id]=max(ans[id],t.ask(x,rt[l])); } int main(){ scanf("%d%d",&n,&Q); for(int i=1;i<=n;++i)scanf("%d%lld%d%d",&k[i],&b[i],&l[i],&r[i]); for(int i=1,x,y;i<n;++i)scanf("%d%d",&x,&y),e[x].push_back(y),e[y].push_back(x); dfs(1),dfs(1,1); for(int i=1,x,y,z;i<=Q;++i){ scanf("%d%d%d",&x,&y,&z); for(;top[x]!=top[y];f[x].emplace_back(i,z),x=fa[top[x]])if(d[top[x]]<d[top[y]])swap(x,y); add(min(id[x],id[y]),max(id[x],id[y]),i,z); } calc1(1),calc2(); for(int i=1;i<=n;++i)printf("%lld\n",ans[i]); return 0; }
- 1
信息
- ID
- 11477
- 时间
- 1500ms
- 内存
- 1100MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者