分析

取出一段区间后答案就是虚树边的个数的两倍,

考虑计算\(x\)与父亲的边对答案的贡献,

那么不能够贡献的就是\(x\)的子树下标连续的一段或者是非\(x\)的子树连续的一段,

考虑将\(x\)的子树染色,然后线段树合并


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=1000000007,N=100011;
struct node{int y,next;}e[N<<1];
int n,et=1,ans,m,rt[N],as[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed C(int n){return (1ll*n*(n+1)/2)%mod;}
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
inline signed mo1(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed mo2(int x,int y){return x<y?x-y+mod:x-y;}
struct Segment_Tree{
int Ls[N*20],Rs[N*20],lw[N*20],rw[N*20],lb[N*20],rb[N*20],w[N*20],tot;
inline void pup(int k,int l,int r){
rr int ls=Ls[k],rs=Rs[k],mid=(l+r)>>1;
if (!ls) ls=++tot,lw[ls]=rw[ls]=0,w[ls]=C(lb[ls]=rb[ls]=mid-l+1);
if (!rs) rs=++tot,lw[rs]=rw[rs]=0,w[rs]=C(lb[rs]=rb[rs]=r-mid);
w[k]=mo1(w[ls],w[rs]);
if (rw[ls]&&lw[rs]) w[k]=mo1(w[k],mo2(C(rw[ls]+lw[rs]),mo1(C(rw[ls]),C(lw[rs]))));
if (rb[ls]&&lb[rs]) w[k]=mo1(w[k],mo2(C(rb[ls]+lb[rs]),mo1(C(rb[ls]),C(lb[rs]))));
lw[k]=lw[ls]+((lw[ls]==mid-l+1)?lw[rs]:0),
rw[k]=rw[rs]+((rw[rs]==r-mid)?rw[ls]:0),
lb[k]=lb[ls]+((lb[ls]==mid-l+1)?lb[rs]:0),
rb[k]=rb[rs]+((rb[rs]==r-mid)?rb[ls]:0);
}
inline signed update(int rt,int l,int r,int x){
if (!rt) rt=++tot;
if (l==r){
w[rt]=lw[rt]=rw[rt]=1,
lb[rt]=rb[rt]=0;
return rt;
}
rr int mid=(l+r)>>1;
if (x<=mid) Ls[rt]=update(Ls[rt],l,mid,x);
else Rs[rt]=update(Rs[rt],mid+1,r,x);
pup(rt,l,r);
return rt;
}
inline signed Merge(int fi,int se,int l,int r){
if (!fi||!se) return fi|se;
if (lb[fi]==r-l+1) return se;
if (rb[se]==r-l+1) return fi;
rr int mid=(l+r)>>1;
Ls[fi]=Merge(Ls[fi],Ls[se],l,mid);
Rs[fi]=Merge(Rs[fi],Rs[se],mid+1,r);
pup(fi,l,r);
return fi;
}
}Tre;
inline void dfs(int x,int fa){
for (rr int i=as[x];i;i=e[i].next) if (e[i].y!=fa)
dfs(e[i].y,x),rt[x]=Tre.Merge(rt[x],rt[e[i].y],1,n);
rt[x]=Tre.update(rt[x],1,n,x),ans=mo1(ans,mo2(m,Tre.w[rt[x]]));
}
signed main(){
freopen("communicate.in","r",stdin);
freopen("communicate.out","w",stdout);
n=iut(),Tre.tot=0,m=C(n);
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
dfs(1,0);
ans=2ll*ans*ksm(m,mod-2)%mod;
return !printf("%d",ans);
}

#线段树合并#JZOJ 5365 通信的更多相关文章

  1. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

  2. [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

  3. BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )

    路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...

  4. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

    [bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...

  6. bzoj3702二叉树 线段树合并

    3702: 二叉树 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 600  Solved: 272[Submit][Status][Discuss] ...

  7. BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...

  8. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  9. BZOJ_3307_雨天的尾巴_线段树合并+树上差分

    BZOJ_3307_雨天的尾巴_线段树合并 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后 ...

  10. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

随机推荐

  1. swagger 文档优化 knife4j 增强 Swagger

    swagger 省去了程序员开发过程中拟写接口文档的时间,是团队开发必不可少的工具,原生的swagger 界面功能比较少,也不支持文档导出,业界也有不少针对swagger 文档界面优化的插件,良莠不齐 ...

  2. OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)

    上一篇:<OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)>下一篇:敬请期待-   前言  上一篇编译了osg和osgCurl ...

  3. 使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

    前言 为什么会想要调试源码? 苹果开源了部分源码, 但相似内容太多, 基本找不到代码见的对应关系, 如果能像自己工程一样进行跳转那多好哇~~ 苹果源码开源地址: https://opensource. ...

  4. EL表达式处理字符串

    示例 JSP页面页头添加 <%@ taglib uri="/WEB-INF/taglib/c.tld" prefix="c"%> <%@ ta ...

  5. 【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题

    问题描述 Java Function在Azure上遇见中文显示乱码问题?如何解决呢? 问题解答 中文字符显示为乱码,这个情况就是服务实例上设置的编码格式不是统一的UTF-8所导致的. 在查看Azure ...

  6. 深入解析ASP.NET Core MVC应用的模块化设计[上篇]

    ASP.NET Core MVC的"模块化"设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载.这种为"飞行中的飞 ...

  7. Java //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除)+优化

    1 //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除) 2 boolean isFlag = true; //标识i是否被j除尽,修改其值 3 4 for(int i ...

  8. 牛客周赛34(A~E)

    A 两种情况 两个字符相同只有2 两个字符不相同4 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) fo ...

  9. Java 程序员第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

    人工智能时代,最需要学习的编程语言是:python .笔者是个 python 小白,昨天花了两个小时,第一次成功运行起来 python 项目 . 项目是 powerpoint-extractor ,可 ...

  10. Rsync 备份服务搭建

    Rsync 备份服务搭建 目录 Rsync 备份服务搭建 一. 前言 二. rsync 和 sersync 2.1 rsync 基本语法 2.2 本地文件传输 2.3 ssh 远程文件传输 2.4 基 ...