Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30377 | liuyile | 【S】T4 | C++ | 通过 | 100 | 849 MS | 46948 KB | 2783 | 2024-07-19 12:33:17 |
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" int n; int l[100030],r[100300]; const int V=1e5; const int M=1e9+7; int TGALL=1; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){ return qp(x,M-2); } inline void add(int &x,int y){ x+=y; if(x>=M)x-=M; } struct node{ int sA,sB,sAB,len; int tgA,tgB; inline void addA(int k){ add(sA,len*k%M); add(sAB,sB*k%M); add(tgA,k); } inline void addB(int k){ add(sB,len*k%M); add(sAB,sA*k%M); add(tgB,k); } }T[100030<<2]; int s[100030]; #define lc(x) (x<<1) #define rc(x) (x<<1|1) inline void upd(int x){ T[x].sA=(T[lc(x)].sA+T[rc(x)].sA)%M; T[x].sB=(T[lc(x)].sB+T[rc(x)].sB)%M; T[x].sAB=(T[lc(x)].sAB+T[rc(x)].sAB)%M; } inline void pd(int x){ int wa=T[x].tgA,wb=T[x].tgB; T[x].tgA=T[x].tgB=0; if(wa){ T[lc(x)].addA(wa); T[rc(x)].addA(wa); } if(wb){ T[lc(x)].addB(wb); T[rc(x)].addB(wb); } } inline void bd(int x,int l,int r){ if(l==r){ T[x]={0,0,0,1}; return ; } int mid=l+r>>1; bd(lc(x),l,mid); bd(rc(x),mid+1,r); upd(x); T[x].len=r-l+1; } inline void add(int x,int l,int r,int L,int R,int a,int b){ if(L<=l&&r<=R){ T[x].addA(a); T[x].addB(b); return ; } pd(x); int mid=l+r>>1; if(L<=mid)add(lc(x),l,mid,L,R,a,b); if(R>mid)add(rc(x),mid+1,r,L,R,a,b); upd(x); } inline void ins(int x){ int IV=inv(r[x]-l[x]+1); add(1,1,V,l[x],r[x],M-IV,IV); } inline void del(int x){ int IV=inv(r[x]-l[x]+1); add(1,1,V,l[x],r[x],IV,M-IV); } inline int VAL(){ return T[1].sAB; } vector<int>g[100300]; int siz[100300],hs[100300]; inline void dop(int u,int fa,int op){ if(op==1)ins(u); else del(u); for(int v:g[u])if(v!=fa)dop(v,u,op); } inline void dfs(int u,int fa){ TGALL=TGALL*(r[u]-l[u]+1)%M; siz[u]=1; add(1,1,V,l[u],r[u],inv(r[u]-l[u]+1),0); for(int v:g[u])if(v!=fa){ dfs(v,u); siz[u]+=siz[v]; if(siz[v]>siz[hs[u]])hs[u]=v; } } int res=0; inline void calc(int u,int fa,bool kp){ for(int v:g[u])if(v!=fa&&v!=hs[u])calc(v,u,0); if(hs[u])calc(hs[u],u,1); for(int v:g[u])if(v!=fa&&v!=hs[u])dop(v,u,1); ins(u); res=(res+VAL())%M; // cout<<u<<" "<<VAL()<<" "<<VAL()*TGALL%M<<endl; if(!kp)dop(u,fa,0); } signed main(){ ios::sync_with_stdio(0); // freopen("route.in","r",stdin); // freopen("route.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) cin>>l[i]>>r[i]; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } bd(1,1,V); dfs(1,0); // cout<<TGALL<<endl; calc(1,0,0); cout<<res*TGALL%M<<endl; cout.flush(); return 0; }