1 条题解

  • 0
    @ 2026-8-6 10:22:28
    #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
    上传者