#线段树合并#JZOJ 5365 通信

分析
取出一段区间后答案就是虚树边的个数的两倍,
考虑计算\(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 通信的更多相关文章
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- 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). 复杂度看起来不高, ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
[bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...
- bzoj3702二叉树 线段树合并
3702: 二叉树 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 600 Solved: 272[Submit][Status][Discuss] ...
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- BZOJ_3307_雨天的尾巴_线段树合并+树上差分
BZOJ_3307_雨天的尾巴_线段树合并 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后 ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
随机推荐
- Docker方式快速启动一个Redis实例
安装Redis有多种方式,除了可以通过各个平台的软件包工具安装外,还可以直接从源码安装. 但是,安装Redis可能会遇到一些这样的问题,比如: 1.网络环境比较差,下载耗时比较长 2.从源码编译安装时 ...
- MYSQL查询数据表中某个字段包含某个数值
当某个字段中字符串是"1,2,3,4,5,6"或者"123456"查询数据表中某个字段是否包含某个值1:模糊查询 使用like select * ...
- 麒麟系统开发笔记(五):制作安装麒麟系统的启动U盘、物理机安装麒麟系统以及搭建Qt开发环境
前言 电脑从U盘装麒麟系统,搭建实机Qt开发运行环境. 制作麒麟系统U盘(使用LiveUSB) 步骤一:先准备个至少8GB的U盘 之前购买的一批联想U盘,如下图: 查看U盘: 步 ...
- 【Application Insights】使用Powershell命令向Application Insgihts发送测试数据
问题描述 在昨天的文章中,介绍了 "[Application Insights]使用CURL命令向Application Insgihts发送测试数据",今天则继续实验通过Powe ...
- 非正式全面解析 NebulaGraph 中 Session 管理
NebulaGraph 论坛最近有些讨论帖,各种姿势来问 NebulaGraph Session 管理相关的事情,我寻思这也不是一个法子,还是来写一篇文章来讲述下 NebulaGraph 中的 Ses ...
- curator-framework 使用采坑记之org.apache.zookeeper.ClientCnxn - Opening socket connection to server..........Will not attempt to authenticate using SASL (unknown error)报错解决
一.curator-framework 简介 curator-framework 是对zookeeper做的分二次分布式封装处理,目前代码也是apache 开源社区维护,如下所示. github地址 ...
- 使用rpa打开浏览器并执行js抓取页面元素详情步骤
这里我们专门开一个文章来写如何在rpa中执行js获取页面元素. 个人觉得,复杂点的需求用js会方便很多,所以后续的文章我都会重点使用js去获取页面元素. 好,正文开始,我们先看一下rpa为我们提供的自 ...
- 机器学习从入门到放弃:卷积神经网络CNN(二)
一.前言 通过上一篇文章,我们大概了解了卷积是什么,并且分析了为什么卷积能在图像识别上起到巨大的作用.接下来,废话不多话,我们自己尝试动手搭建一个简易的CNN网络. 二.准备工作 在开始的时候,我们首 ...
- vim没有clipboard,没法复制到系统剪切板,通过xclip将复制、删除的内容放到系统剪切板
解决方法:在/etc/vim/vimrc 或者 ~/.vimrc 中添加下面的命令 au TextYankPost * exe system("xclip -selection clipbo ...
- SqlServer复制和订阅(实现主从同步)
SqlServer复制和订阅 注意: 1.登录必须是服务器名称不能是ip 2.订阅服务器不需要提前创建数据库 复制 1.展开要发布的数据库节点,找到复制下的本地发布 2.右击本地发布,选择本地发布 3 ...