51nod2626-未来常数【树上启发式合并,线段树】

正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=2626


题目大意

给出nnn个点的一棵树,每个区间[l,r][l,r][l,r]的代价是选出这个区间中的一个点xxx使得它走到所有点然后又回到xxx的路程最短长度,求一个随机区间的期望代价。

1≤n≤1051\leq n\leq 10^51n105


解题思路

考虑统计每条边的贡献,一条边会被记入当且仅当分成的两个树各存在一个点在区间中。

考虑怎么统计这个贡献,计在两棵树中的点分别为000111,那么合法区间就是包含至少一个111和一个000的区间,用线段树统计只包含000111的区间减去即可。

然后在树上的问题,所以直接上dsu on tree就好了。

时间复杂度:O(nlog⁡2n)O(n\log^2n)O(nlog2n)

然后写完题解突然发现线段树合并好像也行而且更快(?


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,P=1e9+7;
struct node{ll to,next;
}a[N<<1];
ll n,tot,ans,ls[N],siz[N],son[N];
ll w[N<<2],l0[N<<2],r0[N<<2],l1[N<<2],r1[N<<2];
void Merge(ll x,ll L,ll R){ll mid=(L+R)>>1;w[x]=w[x*2]+w[x*2+1]+r0[x*2]*l0[x*2+1]+r1[x*2]*l1[x*2+1];l0[x]=(l0[x*2]==mid-L+1)*l0[x*2+1]+l0[x*2];r0[x]=(r0[x*2+1]==R-mid)*r0[x*2]+r0[x*2+1];l1[x]=(l1[x*2]==mid-L+1)*l1[x*2+1]+l1[x*2];r1[x]=(r1[x*2+1]==R-mid)*r1[x*2]+r1[x*2+1];return;
}
void Build(ll x,ll L,ll R){if(L==R){w[x]=r0[x]=l0[x]=1;return;}ll mid=(L+R)>>1;Build(x*2,L,mid);Build(x*2+1,mid+1,R);Merge(x,L,R);return;
}
void Change(ll x,ll L,ll R,ll pos){if(L==R){swap(l0[x],l1[x]);swap(r0[x],r1[x]);return;}ll mid=(L+R)>>1;if(pos<=mid)Change(x*2,L,mid,pos);else Change(x*2+1,mid+1,R,pos);Merge(x,L,R);return;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(ll x,ll fa){siz[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
void calc(ll x,ll fa){Change(1,1,n,x);for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;calc(y,x);}return;
}
void solve(ll x,ll fa,ll top){for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||y==son[x])continue;solve(y,x,y);}if(son[x])solve(son[x],x,top);Change(1,1,n,x);for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||y==son[x])continue;calc(y,x);}(ans+=(n*(n+1)/2-w[1])%P)%=P;if(x==top)calc(x,fa);return;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
signed main()
{scanf("%lld",&n);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}Build(1,1,n);dfs(1,1);solve(1,1,0);printf("%lld\n",ans*2*power(n*(n+1)/2%P,P-2)%P);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A*,IDA*—高档次的暴搜

A*通过评价函数来判断当前状态是否可以到达最终状态(即可行性剪枝)&#xff0c;来减少不必要的搜索。 例题——P2324 [SCOI2005]骑士精神 我们通过当前不在指定位置上的棋子个数为评价函数&#xff0c;\(used\) 【评价函数值】超过了预期的值&#xff0c;便不用再线下深入搜索了…

P2486 [SDOI2011]染色

P2486 [SDOI2011]染色 题意&#xff1a; 题解&#xff1a; 与一般的树链剖分相比&#xff0c;不同点在于查询的不是路径上颜色的数量而是颜色段的数量 对于两个颜色段&#xff0c;112和221&#xff0c;两个颜色段数量都是2 如果合在一起颜色段的数量就是3&#xff0c;因为左边…

牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

文章目录T1&#xff1a;仓鼠的石子游戏题目题解代码实现T2&#xff1a;乃爱与城市拥挤程度题目题解代码实现T3&#xff1a;小w的魔术扑克题目题解代码实现T1&#xff1a;仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑&#xff0c;无聊的他们跑到一块空地上&#xff0c;空地上有…

使用PerfView监测.NET程序性能(二):Perfview的使用

在上一篇博客使用PerfView监测.NET程序性能&#xff08;一&#xff09;&#xff1a;Event Trace for Windows 中&#xff0c;我们了解了对Windows及应用程序进行性能分析的基础&#xff1a;Event Trace for Windows (ETW)。现在来看看基于ETW的性能分析工具——Perfview.exePer…

连通性相关

强联通分量 强连通&#xff1a;有向图 \(G\) 强连通表示&#xff0c;\(G\) 中任意两个结点连通。 强连通分量( Strongly Connected Components &#xff0c;简称 \(\operatorname{SCC}\) )&#xff1a;极大的 强连通子图。 Tarjan 维护了以下两个变量&#xff1a; \(dfn\) &…

CF505E-Mr. Kitayuta vs. Bamboos【贪心,二分】

正题 题目链接:https://www.luogu.com.cn/problem/CF505E 题目大意 开始一个长度为nnn的序列hhh&#xff0c;mmm天每天你可以kkk次选择一个hih_ihi​让它等于himax{hi−p,0}h_imax\{h_i-p,0\}hi​max{hi​−p,0}&#xff0c;然后结束时让每个hihiaih_ih_ia_ihi​hi​ai​&…

阶段总结:8.09-8.18 十日模拟

一图流了解一下 文章目录十日谈总结十日谈 再总结一下 8.09 搜索模拟&#xff1a;25分。…毕竟是第一天不太适应吧 &#xff08;拼命找借口&#xff09;。没有看到标题就很淦&#xff0c;就是全写挂了而已&#xff0c;已经无从谈起…hzwer的粉丝那题提醒我们不要被吓人的数据…

学习有向图和无向图的强连通分量(基本概念+割点+点双联通分量+桥+边双连通分量+全套模板【Tarjan】)

最近总是考到Tarjan&#xff0c;让我措手不及基本概念割点以及点双连通分量Tarjan法求割点推导过程代码实现Tarjan法求点双连通分量推导过程代码实现有向图的Tarjan缩点桥与边双连通分量Tarjan法求桥理论推导代码实现Tarjan法求边双连通分量理论推导代码实现前言&#xff1a;有…

.NET Core下的Spring Cloud——前言和概述

前言前几年一直在写类似dubbo&#xff0c;Spring Cloud的微服务框架辗辗转转重复了多次&#xff0c;也重构推翻了很多次&#xff0c;其中诞生了“Rabbit.Rpc”,”Go”,”RabbitCloud”等开源项目。其中不乏他人对这些项目的完善。很高兴自己的开源项目能够给他人提供思路和复用…

期望 概率DP

期望 \(x\) 的期望 \(E(x)\) 表示平均情况下 \(x\) 的值。 令 \(C\) 表示常数&#xff0c; \(X\) 和 \(Y\) 表示两个随机变量。 \(E(C)C\) \(E(C \times X)C \times E(X)\) \(E(XY)E(X)E(Y)\) 期望的线性性 \(E(XY)\) 不一定等于 \(E(X) \times E(Y)\) 期望练习&#xff1a…

CF785E Anton and Permutation

CF785E Anton and Permutation 题意&#xff1a; 对于一个长度为 n 的序列进行 k 次操作&#xff0c;每次操作都是交换序列中的某两个数。对于每一个操作&#xff0c;回答当前序列中有多少个逆序对。 1<n<200000 1<q<50000 题解&#xff1a; 动态逆序对&#x…

P5311-[Ynoi2011]成都七中【点分树,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P5311 题目大意 给出nnn个点的一棵树&#xff0c;每个节点有一个颜色&#xff0c;mmm次询问提出区间[l,r][l,r][l,r]的点构成的生成子图中xxx所在连通块的颜色数。 1≤n,m,ai≤1051\leq n,m,a_i\leq 10^51≤n,m,ai​≤105 解…

[ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

一次性写两道题T1&#xff1a;一个简单的询问题目题解代码实现T2&#xff1a;愤怒的小鸟题目暴搜题解暴搜代码实现状压DP题解状压DP代码实现T1&#xff1a;一个简单的询问 题目 给你一个长度为 N 的序列 ai ,1≤i≤N&#xff0c;和 q 组询问&#xff0c;每组询问读入 l1,r1,l…

微软发布新的 Azure Pipelines 功能和集成

在最近举行的Connect()大会上&#xff0c;微软发布了几项新功能以及与 Azure Pipelines 的集成&#xff0c;包括 Visual Studio Code 的 Azure Pipelines 扩展、GitHub 版本管理、对 IoT 项目的支持以及 ServiceNow 集成。自从 9 月份推出 Azure Pipelines 以来&#xff0c;这种…

平衡树练习总结

文章目录前言普通平衡树文艺平衡树郁闷的出纳员书架宠物收养场机械排序千山鸟飞绝总结前言 专门刷了一天半的平衡树 &#xff08;附带划水OvO&#xff09; 使用的是蜜汁常数的splay 感觉对平衡树的理解还是有帮助的 一些较为常规的平衡树的题应该是差不多了 更正之前刚学的观点…

二维树状数组

二维树状数组可以实现在平面上的区域加、区域查询等操作。 区域修改 我们在一维时维护树状数组的区间操作时&#xff0c;对其进行了差分。类比一维的思想&#xff0c;我们在二维平面上也对树状数组差分。 我们来看二维的前缀和&#xff1a; \[sum(i,j)sum(i-1,j)sum(i,j-1)-sum…

【AcWing 249. 蒲公英】

【AcWing 249. 蒲公英】 题意&#xff1a; 长度为n的序列&#xff0c;给定区间&#xff0c;求区间众数&#xff0c;如果出现次数相同&#xff0c;输出编号最小的 题解&#xff1a; 区间众数&#xff0c;不带修改&#xff0c;强制在线&#xff08;否则可以莫队&#xff09; …

年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇

2018年就结束了&#xff0c;马上就要迎来2019年&#xff0c;这一年很不平凡&#xff0c;中美贸易战还在继续&#xff0c;IT互联网发生急剧变化&#xff0c;大量互联网公司开始裁员&#xff0c;微软的市值在不断上升 &#xff0c;在互联网公司的市值下跌过程中爬到了第一的位置&…

等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

文章目录T1&#xff1a;等比数列三角形题目题解代码实现T2&#xff1a;电报题目题解代码实现T1&#xff1a;等比数列三角形 题目 求三边都是 ≤n 的整数&#xff0c;且成等比数列的三角形个数 注意三角形面积不能为 0 注意 oeis 中未收录此数列&#xff0c;所以并不需要去搜了…

模板:笛卡尔树

介绍 笛卡尔树是一种非常特殊的二叉搜索树。每个节点有两个信息x和y。如果只考虑 x&#xff0c;它是一棵二叉搜索树&#xff0c;如果只考虑 y&#xff0c;它是一个小根堆。 实现 按照y升序插入 显然应该插入到一条极右链上 但为了维护x二叉搜索树的性质 对于右链上x>当前…