Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30673 | yuanjiabao | 【S】T4 | C++ | 通过 | 100 | 191 MS | 30788 KB | 3026 | 2024-07-22 14:52:21 |
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<ctime> #define timeMS (clock()*1000/CLOCKS_PER_SEC) int clk; using namespace std; #define int long long inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=100010,P=1000000007; inline int fpow(int a,int b=P-2){ int c=1; for(;b;b>>=1,a=a*a%P)if(b&1)c=c*a%P; return c; } class bst{ public: int sum1[N],sum2[N]; bst(){memset(sum1,0,sizeof(sum1));memset(sum2,0,sizeof(sum2));} inline void add(int p, int x){for(int i=p;i<N;i+=i&-i)sum1[i]=(sum1[i]+x)%P,sum2[i]=(sum2[i]+x*p)%P;} inline void add(int l,int r,int x){add(l,x),add(r+1,-x);} inline int ask(int p){int res=0;for(int i=p;i;i-=i&-i)res=(res+(p+1)*sum1[i]-sum2[i])%P;return res;} inline int get_sum(int l, int r){return (ask(r)-ask(l-1))%P;} }ds; int n,head[N],to[N<<1],nex[N<<1],l[N],r[N],ilen[N],prd=1; int siz[N],hson[N],dep[N],fa[N]; int dfn[N],top[N]; void dfs1(int nd,int dep_=1){ dep[nd]=dep_; siz[nd]=1; for(int i=head[nd];i;i=nex[i])if(to[i]!=fa[nd]){ fa[to[i]]=nd; dfs1(to[i],dep_+1); siz[nd]+=siz[to[i]]; if(siz[hson[nd]]<=siz[to[i]])hson[nd]=to[i]; } } void dfs2(int nd,int top_){ dfn[nd]=++dfn[0]; top[nd]=top_; if(hson[nd])dfs2(hson[nd],top_); for(int i=head[nd];i;i=nex[i])if(to[i]!=fa[nd]&&to[i]!=hson[nd])dfs2(to[i],to[i]); } inline void add(int nd,int k){ while(nd){ ds.add(dfn[top[nd]],dfn[nd],k); nd=fa[top[nd]]; } } inline int get_sum(int nd){ int res=0; while(nd){ res=(res+ds.get_sum(dfn[top[nd]],dfn[nd]))%P; nd=fa[top[nd]]; } return res; } vector<int>ins[N],del[N]; int ans=0; void init(){ cin>>n; for(int i=1;i<=n;i++){ l[i]=read(); r[i]=read(); prd=prd*(r[i]-l[i]+1)%P; ilen[i]=fpow(r[i]-l[i]+1); ins[l[i]-1].emplace_back(i); del[r[i]].emplace_back(i); } for(int i=1;i<n;i++){ int u=read(),v=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; } dfs1(1); dfs2(1,1); } signed main(){ // freopen("read.in","r",stdin); init(); int sum1=0,sum2=0; for(int i=0;i<N;i++){ for(int x:ins[i]){ ans=(ans-(dep[x]*sum1+sum2-2*get_sum(x))%P*ilen[x]%P*i)%P; sum1=(sum1+ilen[x])%P; sum2=(sum2+ilen[x]*dep[x])%P; add(x,ilen[x]); } for(int x:del[i]){ ans=(ans+(dep[x]*sum1+sum2-2*get_sum(x))%P*ilen[x]%P*i)%P; sum1=(sum1-ilen[x])%P; sum2=(sum2-ilen[x]*dep[x])%P; add(x,-ilen[x]); } } cout<<(ans+P)%P*prd%P; // cerr<<endl<<timeMS<<' '<<clk; return 0; }