分析

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

考虑计算\(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. 一次nginx返回422状态码的经历

    故事背景 后端使用Docker Compose部署一个代码片段管理应用:snibox,某天因为云服务卡死重启之后再次访问时,登录或退出都返回422状态码. 界面提示如下: 不过奇怪的是:直接通过IP+ ...

  2. python文件加锁模块之fcntl

    # 示例 import fcntl with open('./test.txt', 'w') as f: fcntl.flock(f, fcntl.LOCK_EX) # 对文件加锁,除加锁进程外其它进 ...

  3. abc模块的用法

    首先需要了解的是一个基类(父类),abc.ABCMeta.这个是用于实现抽象类的一个基础类 抽象方法的使用,在相应的方法之前一行加上@abstractmethod之后,从新的一行开始定义相应的方法.实 ...

  4. 【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令

    问题描述 使用Azure Redis,是否可以开启慢日志来查看最近时间中执行比较耗时的指令呢? 同时,如何执行Redis的Config只能来修改配置呢? 根本原因 一:Azure Reids通过Red ...

  5. 【Azure 存储服务】使用PowerShell脚本创建存储账号(Storage Account)的共享访问签名(SASToken) : New-AzStorageContainerSASToken

    问题描述 使用PowerShell脚本如何来创建存储账号(Storage Account)的共享访问签名呢?查询到可以使用 New-AzStorageContainerSASToken 命令来生成Az ...

  6. 图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

    LDBC(Linked Data Benchmark Council)Social Network Benchmark,简称 LDBC SNB,是一种针对社交网络场景的评估图数据库性能的基准测试. L ...

  7. 利用Nginx正向代理实现局域网电脑访问外网

    引言 在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的.这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx ...

  8. C#实现FTP服务端和客户端

    目录 简介 FTP客户端 系统客户端 客户端软件 自定义客户端 FTP服务端 系统服务端 服务端软件 自定义服务端 附件 简介 FTP是FileTransferProtocol(文件传输协议)的英文简 ...

  9. IDEA/Android Studio的gradle控制台输出中文乱码问题解决

    原文地址: IDEA/Android Studio的gradle控制台输出中文乱码问题解决 - Stars-One的杂货小窝 在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变 ...

  10. [置顶] apache+tomcat集群出现的两次请求问题解决方案

    自从做了架构师,经常需要解决奇葩问题......... 现象:点击一次按钮,相应servlet收到两次请求,servlet执行了两次,导致数据错乱. 解决方案: 之所以出现两次请求,并不是浏览器问题, ...