提交时间:2025-10-29 21:23:34

运行 ID: 38822

#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair #define ll long long using namespace std; const int N=1e5+10,mod=1e9+7; int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; b>>=1;a=1ll*a*a%mod; }return x; } void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} int n; vector<pii> ask[N];vector<int> E[N]; int dfn[N],idfn[N],siz[N],dep[N],fa[N],hs[N],top[N],dc=0; void dfs(int u,int pa){ dep[u]=dep[pa]+1;siz[u]=1;fa[u]=pa; pii p=mk(0,0); for(auto v:E[u]){ if(v==pa) continue; dfs(v,u);siz[u]+=siz[v]; p=max(p,mk(siz[v],v)); }hs[u]=p.se; } void dfs2(int u,int pa,int tp){ dfn[u]=++dc;idfn[dc]=u;top[u]=tp; if(hs[u]) dfs2(hs[u],u,tp); for(auto v:E[u]){ if(v==pa||v==hs[u]) continue; dfs2(v,u,v); } } struct segtree{ #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 int T1[N<<2],T2[N<<2],tg[N<<2],len[N<<2]; void pu(int p){ T1[p]=(T1[ls]+T1[rs])%mod; T2[p]=(T2[ls]+T2[rs])%mod; } void pd(int p){ Add(tg[ls],tg[p]); Add(tg[rs],tg[p]); Add(T2[ls],(1ll*tg[p]*tg[p]%mod*len[ls]+2ll*tg[p]*T1[ls])%mod); Add(T2[rs],(1ll*tg[p]*tg[p]%mod*len[rs]+2ll*tg[p]*T1[rs])%mod); Add(T1[ls],1ll*len[ls]*tg[p]%mod); Add(T1[rs],1ll*len[rs]*tg[p]%mod); tg[p]=0; } void bd(int p,int l,int r){ len[p]=r-l+1;if(l==r) return ; bd(ls,l,mid);bd(rs,mid+1,r);pu(p); } void upd(int p,int l,int r,int pl,int pr,int v){ if(pl<=l&&r<=pr){ Add(tg[p],v); Add(T2[p],(1ll*v*v%mod*len[p]+2ll*v*T1[p])%mod); Add(T1[p],1ll*len[p]*v%mod); return ; }pd(p); if(pl<=mid) upd(ls,l,mid,pl,pr,v); if(pr>mid) upd(rs,mid+1,r,pl,pr,v); pu(p); } void ad(pii &a,pii b){Add(a.fi,b.fi);Add(a.se,b.se);} pii qry(int p,int l,int r,int pl,int pr){ //cout<<p<<' '<<l<<' '<<r<<' '<<T1[p]<<' '<<T2[p]<<endl; if(pl<=l&&r<=pr) return mk(T1[p],T2[p]); pd(p);pii a=mk(0,0); if(pl<=mid) ad(a,qry(ls,l,mid,pl,pr)); if(pr>mid) ad(a,qry(rs,mid+1,r,pl,pr)); return a; } }sgt; void update(int u,int x){ while(u){ sgt.upd(1,1,n,dfn[top[u]],dfn[u],x); u=fa[top[u]]; } } int main(){ //freopen("route.in","r",stdin); //freopen("route.out","w",stdout); cin>>n; int val=1; for(int i=1;i<=n;i++){ int l,r;cin>>l>>r; int iv=qp(r-l+1,mod-2); val=1ll*val*(r-l+1)%mod; ask[l].push_back(mk(i,iv)); ask[r+1].push_back(mk(i,mod-iv)); } for(int i=1;i<n;i++){ int u,v;cin>>u>>v; E[u].push_back(v); E[v].push_back(u); }dfs(1,0);dfs2(1,0,1); sgt.bd(1,1,n); int ans=0; const int LM=100003; //const int LM=5; for(int i=1;i<=LM;i++){ for(auto ed:ask[i]) update(ed.fi,ed.se); int sum=sgt.qry(1,1,n,1,1).fi; pii res=sgt.qry(1,1,n,2,n); //cout<<res.fi<<' '<<res.se<<' '<<sum<<endl; Add(ans,(1ll*sum*res.fi-res.se+mod)%mod); }cout<<1ll*ans*val%mod<<endl; return 0; }