Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30565 baka24 【S】T4 C++ 运行超时 0 1000 MS 38844 KB 4273 2024-07-19 19:12:51

Tests(0/20):


#include<bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define inx int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v inline int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=300010,Mod=1000000007; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,a[MAXN],b[MAXN],sm,ny[MAXN]; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int vis[MAXN],zx,sz,tp; int getsz(int u,int lst){ if(vis[u])return 0; int res=1; for(inx)if(v!=lst){ res+=getsz(v,u); } return res; } int getzx(int u,int lst){ if(vis[u])return 0; int res=1,mx=0; for(inx)if(v!=lst){ int tmp=getzx(v,u); res+=tmp;mx=max(mx,tmp); } mx=max(mx,n-res); if(mx<tp)tp=mx,zx=u; return res; } int ans; #define lson (pos<<1) #define rson (pos<<1|1) struct segtree{ int t[MAXN<<2],lz[MAXN<<2]; void pushup(int pos){ t[pos]=(t[lson]+t[rson])%Mod; } void pushdown(int pos,int l,int r){ if(lz[pos]){ int mid=(l+r)>>1; t[lson]+=lz[pos]*(mid-l+1)%Mod,t[rson]+=lz[pos]*(r-mid)%Mod; lz[lson]+=lz[pos],lz[rson]+=lz[pos]; t[lson]%=Mod,t[rson]%=Mod,lz[lson]%=Mod,lz[rson]%=Mod; // cout<<lson<<":"<<t[lson]<<" "<<rson<<":"<<t[rson]<<endl; lz[pos]=0; } } void update(int pos,int l,int r,int ql,int qr,int x){ if(ql<=l&&qr>=r){ t[pos]+=x*(r-l+1)%Mod; lz[pos]+=x; t[pos]%=Mod,lz[pos]%=Mod; // cout<<pos<<" "<<l<<" "<<r<<" "<<lz[pos]<<" "<<t[pos]<<endl; return; } pushdown(pos,l,r); int mid=(l+r)>>1; if(ql<=mid)update(lson,l,mid,ql,qr,x); if(qr>mid)update(rson,mid+1,r,ql,qr,x); pushup(pos); } int query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){ // cout<<pos<<" "<<t[pos]<<endl; return t[pos]; } pushdown(pos,l,r); // cout<<pos<<" "<<l<<" "<<r<<" "<<lz[pos]<<" "<<t[lson]<<" "<<t[rson]<<endl; int mid=(l+r)>>1,res=0; if(ql<=mid)res+=query(lson,l,mid,ql,qr); if(qr>mid)res+=query(rson,mid+1,r,ql,qr); return res; } }D,Y; void count(int u,int lst,int d){ if(vis[u])return; ans=(ans+d*sm%Mod*ny[b[u]-a[u]+1]%Mod*Y.query(1,1,m,a[u],b[u])%Mod)%Mod; ans=(ans+sm%Mod*ny[b[u]-a[u]+1]%Mod*D.query(1,1,m,a[u],b[u])%Mod)%Mod; // cout<<u<<" "<<a[u]<<" "<<b[u]<<":"<<d*sm%Mod*ny[b[u]-a[u]+1]%Mod<<" "<<Y.query(1,1,m,a[u],b[u])%Mod<<" "; // cout<<sm%Mod*ny[b[u]-a[u]+1]%Mod<<" "<<D.query(1,1,m,a[u],b[u])%Mod<<endl; for(inx)if(v!=lst){ count(v,u,d+1); } } void add(int u,int lst,int d,int lf){ if(vis[u])return; D.update(1,1,m,a[u],b[u],(Mod+lf*d*ny[b[u]-a[u]+1]%Mod)%Mod); // cout<<"+"<<u<<" "<<a[u]<<" "<<b[u]<<" "<<d*ny[b[u]-a[u]+1]<<endl; Y.update(1,1,m,a[u],b[u],(Mod+lf*ny[b[u]-a[u]+1]%Mod)%Mod); // cout<<"+"<<u<<" "<<a[u]<<" "<<b[u]<<" "<<ny[b[u]-a[u]+1]<<endl; for(inx)if(v!=lst){ add(v,u,d+1,lf); } } void getans(int u){ Y.update(1,1,m,a[u],b[u],ny[b[u]-a[u]+1]); // cout<<"+"<<u<<" "<<a[u]<<" "<<b[u]<<" "<<ny[b[u]-a[u]+1]<<endl; for(inx)if(!vis[v]){ count(v,u,1); add(v,u,1,1); } for(inx)if(!vis[v]){ add(v,u,1,-1); } Y.update(1,1,m,a[u],b[u],(Mod-ny[b[u]-a[u]+1])%Mod); } void dfz(int u,int lst){ sz=getsz(u,lst);tp=n; int tmp=getzx(u,lst); getans(zx); vis[zx]=1; u=zx; for(inx)if(!vis[v]){ dfz(v,u); } } void slv(){ n=read(); for(int i=1;i<MAXN-5;i++)ny[i]=Pow(i,Mod-2); sm=1; for(int i=1;i<=n;i++)a[i]=read(),b[i]=read(),m=max(m,b[i]),sm=sm*(b[i]-a[i]+1)%Mod; for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); } dfz(1,1); printf("%lld",ans); } signed main(){ slv(); return 0; }


测评信息: