[JZOJ5365]通信
来源:互联网 发布:筑业标书制作软件 编辑:程序博客网 时间:2024/06/13 08:59
题目大意
给定一棵
求出方案代价的期望值。
题目分析
选出一段点的代价是它们构成的虚树的边的数量的两倍。
看到路径长度期望直接期望线性性拆成边讨论。
如果我们能够统计每一条边两边的连续段方案数那就能求出跨越该边的方案数。考虑使用
加入段还要合并再更新答案看起来需要很复杂的分类讨论,其实不然。我们令
时间复杂度
代码实现
#include <algorithm>#include <iostream>#include <cstdio>#include <cctype>#include <set>using namespace std;typedef pair<int,int> data;typedef set<data>::iterator itr;#define mkp(a,b) make_pair(a,b)#define ft first#define sd secondinline int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}const int P=1000000007;const int N=100005;const int E=N<<1;int quick_power(int x,int y){ int ret=1; for (;y;y>>=1,x=1ll*x*x%P) if (y&1) ret=1ll*ret*x%P; return ret;}int last[N],id[N],ans[N],cnt[N][2];int tov[E],nxt[E];set<data> blocks[N];int n,tot,sum,inv,all;inline int calc(int len){return (1ll*(len+1)*len>>1)%P;}inline void insert(int x,int y){tov[++tot]=y,nxt[tot]=last[x],last[x]=tot;}void dfs(int x,int fa){ id[x]=x,blocks[x].insert(mkp(x,x)),cnt[x][1]=(calc(x-1)+calc(n-x))%P,cnt[x][0]=1; for (int i=last[x],y;i;i=nxt[i]) if ((y=tov[i])!=fa) { dfs(y,x),(sum+=(((all-ans[y]+P)%P)<<1)%P)%=P; int u=id[x],v=id[y]; if ((int)blocks[u].size()<(int)blocks[v].size()) swap(u,v),cnt[x][0]=cnt[y][0],cnt[x][1]=cnt[y][1]; id[x]=u; for (itr it=blocks[v].begin();it!=blocks[v].end();++it) { data blk=*it;itr pos=blocks[u].insert(blk).ft; int x_=blk.ft,y_=blk.sd,st,en,l,r; if (pos!=blocks[u].begin()) { st=(--pos)->sd+1; if (st==x_) l=pos->ft; else l=x_; ++pos; }else l=x_,st=1; ++pos; if (pos!=blocks[u].end()) { en=pos->ft-1; if (y_==en) r=pos->sd; else r=y_; }else r=y_,en=n; --pos; (((((cnt[x][0]+=P-calc(x_-l))%=P)+=P-calc(r-y_))%=P)+=calc(r-l+1))%=P; (((((cnt[x][1]+=P-calc(en-st+1))%=P)+=calc(x_-st))%=P)+=calc(en-y_))%=P; if (x_!=l) { itr pos_=--pos;++pos; blocks[u].erase(pos_),blocks[u].erase(mkp(x_,y_)),pos=blocks[u].insert(mkp(l,y_)).ft; } if (y_!=r) { itr pos_=++pos;--pos; blocks[u].erase(pos_),blocks[u].erase(mkp(l,y_)),blocks[u].insert(mkp(l,r)); } } blocks[v].clear(); } ans[x]=(cnt[x][0]+cnt[x][1])%P;}int main(){ freopen("communicate.in","r",stdin),freopen("communicate.out","w",stdout); n=read(); for (int i=1,x,y;i<n;++i) x=read(),y=read(),insert(x,y),insert(y,x); all=calc(n),dfs(1,0),inv=quick_power(all,P-2),printf("%d\n",1ll*sum*inv%P); fclose(stdin),fclose(stdout); return 0;}
阅读全文
0 0
- [JZOJ5365]通信
- JZOJ5365. 【GDOI2018模拟9.14】通信 线段树+重链剖分
- 通信
- 通信
- 通信
- 通信
- 通信
- 通信
- '通信'
- 通信
- 通信
- 网络通信,移动通信
- 进程通信 & 线程通信
- 【通信】通信发展史
- 【通信】通信中的基本知识
- 【通信】互联网通信
- 【通信】移动通信
- 进程通信 线程通信
- 无限轮播
- DexException: Multiple dex files define Lcom/squareup/leakcanary/
- A + B Problem II(大数加法hd1002)
- Android-------多渠道打包
- callback机制
- [JZOJ5365]通信
- bzoj2962 序列操作 线段树
- 简单的异常处理
- hdu 4465 概率+数学处理
- 3532:最大上升子序列和(2.6基本算法之动态规划)
- Winform(XtraReport)实现打印方法(转载)
- 比特率与波特率的区别与联系
- hdu-5924-Mr. Frog’s Problem
- CVTE前端面试