正题
题目大意
nnn个节点的一棵树,随机选择一个区间,求这个区间的点所构成的虚树的期望权值和。
解题思路
考虑每一条边的贡献,定义一边的点为黑点,一边的为白点,显然包含黑白的区间都会产生贡献。考虑减去没有贡献的,也就是对于连续的一段长度为lll的颜色相同的区间会产生贡献n(n+1)2\frac{n(n+1)}{2}2n(n+1)
用线段树维护然后合并即可。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,M=N*20,XJQ=1e9+7;
ll f(ll n)
{return n*(n-1)/2;}
struct Seg_Tree{ll cnt,ls[M],rs[M],lb[M],rb[M],lw[M],rw[M],ans[M];void PushUp(ll x,ll L,ll R){ll mid=(L+R)>>1;if(!ls[x])ls[x]=++cnt,lb[cnt]=rb[cnt]=(mid-L+1),ans[cnt]=f(mid-L+1);if(!rs[x])rs[x]=++cnt,lb[cnt]=rb[cnt]=(R-mid),ans[cnt]=f(R-mid);ans[x]=ans[ls[x]]+ans[rs[x]];ans[x]=ans[x]-f(rb[ls[x]])-f(lb[rs[x]])+f(rb[ls[x]]+lb[rs[x]]);ans[x]=ans[x]-f(rw[ls[x]])-f(lw[rs[x]])+f(rw[ls[x]]+lw[rs[x]]);lb[x]=(lb[ls[x]]==mid-L+1)?(lb[ls[x]]+lb[rs[x]]):lb[ls[x]];rb[x]=(rb[rs[x]]==R-mid)?(rb[rs[x]]+rb[ls[x]]):rb[rs[x]];lw[x]=(lw[ls[x]]==mid-L+1)?(lw[ls[x]]+lw[rs[x]]):lw[ls[x]];rw[x]=(rw[rs[x]]==R-mid)?(rw[rs[x]]+rw[ls[x]]):rw[rs[x]];}void Change(ll &x,ll l,ll r,ll pos){if(!x)x=++cnt;if(l==r){lw[x]=rw[x]=1;return;}ll mid=(l+r)>>1;if(pos<=mid)Change(ls[x],l,mid,pos);else Change(rs[x],mid+1,r,pos);PushUp(x,l,r);}ll Merge(ll x,ll y,ll l,ll r){if(!x||!y)return x+y;if(lb[x]==r-l+1)return y;if(lb[y]==r-l+1)return x;ll mid=(l+r)>>1;ls[x]=Merge(ls[x],ls[y],l,mid);rs[x]=Merge(rs[x],rs[y],mid+1,r);PushUp(x,l,r);return x;}
}T;
struct node{ll to,next;
}a[N*2];
ll n,tot,ls[N],rt[N],ans;
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
ll power(ll x,ll b){ll ans=1;x%=XJQ;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void dfs(ll x,ll fa){T.Change(rt[x],1,n,x);for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x);T.Merge(rt[x],rt[y],1,n);}ans+=f(n)-T.ans[rt[x]];return;
}
int main()
{freopen("communicate.in","r",stdin);freopen("communicate.out","w",stdout);scanf("%lld",&n);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);ans=ans*2%XJQ;printf("%lld",ans*power(n*(n+1)/2,XJQ-2)%XJQ);
}