noip模拟11.3 T3
来源:互联网 发布:linux tcpdump 编辑:程序博客网 时间:2024/05/19 17:08
想不到连着两天都考了同一类的期望dp。今天打的40分的暴力+20分治(挂),看来自己对这一类问题还是掌握的不够灵活。
问题
1.今天在推公式的时候就推错了,只能凭着昨天的印象强行套了昨天的结论。这也算是没能灵活运用的原因之一吧。
2.考试的时候抱着一种【(yiwei)前两题都过了这道题一定过不了的心态】。【这样子不对啊】
思路
来吧让我们推一下公式
f[i]表示从i到root的期望时间, g[i]表示从root到i的期望时间。
例:
1、求f[ ]从i到root的期望时间
从u->v f[v]=f[u]+x[u]
xu=1/d+1/d*sigma(xi+1+xu)
解释:
1/d:为从u走到v的步数(1)*概率(1/d)
sigma(xi+1+xu):xi为和u相连的除了v的其余点也就是->i为u的子节点的集合,意为走到这些点走出来的期望步数,+1为走到其余点的步数(前面乘了1/d,打开括号就是期望值了),+xu为从u节点接着到除v以外别的节点所走的步数的期望
考试的时候写的是 1+1/d*sigma(xi+1+xu),没有乘概率,导致推错。
2、求g[ ]从root到i的期望时间。
从u->v f[v]=f[u]+x[u]
xu=1/d+1/d*sigma(xi+1+xu)
解释:
和上一个唯一的不同就是xi的意义。i为u的子节点以及父节点除了v节点的集合
化简:
化简下来的为:
x[u]=d+sigma(xi)
对于f[ ]:x[u]=2*size[v]-1 因为i表示的是v的子节点
对于g[ ]:x[u]=2*(size[1]-size[v])-1 因为i表示的是v的子节点
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N=1e5+5,P=16,MOD=1e9+7;int n,q;int nxt[2*N],head[N],to[2*N],etot;int anc[N][P+1],g[N],f[N];int dep[N],size[N];void adde(int u,int v){ to[++etot]=v; nxt[etot]=head[u]; head[u]=etot;}void dfs(int u,int fa){ dep[u]=dep[fa]+1; anc[u][0]=fa; for(int p=1;p<=P;p++) anc[u][p]=anc[anc[u][p-1]][p-1]; size[u]=1; for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==fa) continue; dfs(v,u); size[u]+=size[v]; }}//g[]从root到u的期望时间,f[]从u到root的期望时间 void dfs1(int u,int fa){ for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==fa) continue; g[v]=(g[u]+2*(size[1]-size[v])-1)%MOD; f[v]=(f[u]+2*size[v]-1)%MOD; dfs1(v,u); }}int lca(int u,int v){ if(dep[u]<dep[v]) swap(u,v); int t=dep[u]-dep[v]; for(int p=0;t;t>>=1,p++) if(t&1) u=anc[u][p]; if(u==v) return u; for(int p=P;p>=0;p--) if(anc[u][p]!=anc[v][p]) u=anc[u][p],v=anc[v][p]; return anc[u][0];}int main(){ freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); scanf("%d%d",&n,&q); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); adde(u,v),adde(v,u); } g[1]=0,f[1]=0; dfs(1,1); dfs1(1,1); while(q--){ int u,v; scanf("%d%d",&u,&v); int l=lca(u,v); printf("%d\n",((f[u]-f[l]+g[v]-g[l])%MOD+MOD)%MOD); } return 0;}
阅读全文
0 0
- noip模拟11.3 T3
- 【20160904】NOIP模拟赛T3
- NOIP模拟赛 t3 nan
- [NOIP模拟]T3:系列维护
- 【NOIP模拟】 (10.24) T3 math
- noip 2017 模拟 D1 T3
- 【NOIP模拟】 (10.31) T3 纸带
- 【NOIP 模拟题】[T3] 约会(lca)
- NOIP模拟(10.19)T3 放盒子
- NOIP模拟(10.20)T3 裁剪表格
- NOIP模拟(20171023)T3 拆网线
- NOIP模拟(10.22)T3 树
- NOIP模拟(10.23)T3 拆网线
- NOIP模拟(10.24)T3 Math
- NOIP模拟(20171024)T3 数学
- NOIP模拟(20171026)T3 大逃杀
- NOIP模拟(10.26)T3 大逃杀
- NOIP模拟(10.27)T3 心灵治愈
- 关于安卓页面顶部的状态栏,标题栏,actionBar,topBar
- java synchronized关键字的用法
- 各种日期类型转换
- (Android)react-native中路由跳转react-navigation
- vue axios springboot 跨域
- noip模拟11.3 T3
- C++ 返回的内容自动释放
- mac地址真的是全球是唯一的吗
- Azure 分析服务正式发布
- 点亮细胞211-220
- IntelliJ Idea 2017 免费激活方法
- 6. 矩阵的快速转置算法
- spring管理事务失效的原因和No mapping found for HTTP request with URI []DispatcherServlet with name 'sprinmvc错误
- Visual Studio 2013 + Qt + FFMPEG开发环境配置,手把手详细图文