西行妖
来源:互联网 发布:淘宝店铺产品定位 编辑:程序博客网 时间:2024/04/30 10:18
题目
在幻想乡白玉楼有一棵终年不开花的樱树叫西行妖,西行寺幽幽子曾经为了让它开花而大量收集春度,然后被城管教训了一顿…
现在,幽幽子得到城管的允许,收集了S点春度,让西行妖重新开花。
西行妖可以被看成是一棵有n个节点的树,每个叶子节点被分配了1点春度就能开花(幽幽子不会无意义地使用她的春度,于是最多只会给同一个叶子节点分配1点春度),对于非叶子节点i,如果它有至少有1个儿子开花,那么节点i能开花。
据说,西行妖的花开满之时,幽幽子会复活。但是城管只给了S点春度(S≤20),所以幽幽子这次是抱着娱乐的心态种树的。
如果西行妖有至少m个节点开花,那么幽幽子认为它是美丽的。现在幽幽子想知道,有多少种方案,使西行妖是美丽的(答案对10^9+7取模)。
注意:幽幽子不一定会把S点春度都分配完。
分析
设
那么转移为
这样的时间复杂度是
然后发现,事实上很多的
我们可以从前面转移到后面,当发现当前面的
#include <cmath>#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <queue>const int maxlongint=2147483647;const int mo=1000000007;const int N=1005;using namespace std;int fa[N],n,m,s,ans,deep[N],g[N][15],f[N][21][N],a[N][N],d[N],tot,lca[N][N];int dg(int x){ if(!a[x][0]) { d[++tot]=x; return 0; } for(int i=1;i<=a[x][0];i++) { deep[a[x][i]]=deep[x]+1; dg(a[x][i]); }}int lca1(int x,int y){ int l; if(deep[x]<=deep[y]) { l=x; x=y; y=l; } int p=0; for(int i=log2(n);i>=0;i--) { if(deep[g[x][i]]>=deep[y]) { x=g[x][i]; } } for(int i=log2(n);i>=0;i--) { if(g[x][i]!=g[y][i]) { x=g[x][i]; y=g[y][i]; } } x=g[x][0]; return x;}int main(){ freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); scanf("%d%d%d",&n,&m,&s); for(int i=2;i<=n;i++) { scanf("%d",&fa[i]); g[i][0]=fa[i]; a[fa[i]][++a[fa[i]][0]]=i; } deep[1]=1; dg(1); for(int j=1;j<=log2(n);j++) for(int i=1;i<=n;i++) { g[i][j]=g[g[i][j-1]][j-1]; } f[0][0][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { lca[i][j]=lca1(i,j); } for(int i=0;i<=tot-1;i++) { for(int j=0;j<=min(s-1,i);j++) for(int k=0;k<=n;k++) { if(f[d[i]][j][k]) { for(int l=i+1;l<=tot;l++) { (f[d[l]][j+1][k+deep[d[l]]-deep[lca[d[l]][d[i]]]]+=f[d[i]][j][k])%=mo; } } } } for(int i=1;i<=tot;i++) for(int j=1;j<=s;j++) for(int k=m;k<=n;k++) (ans+=f[d[i]][j][k])%=mo; printf("%d",ans);}
1 0
- 西行妖
- 西行妖
- 【JZOJ4599】西行妖
- 【JZOJ 4599】 西行妖
- 【JZOJ 4599】西行妖
- [WorldWide_D幻想乡♂模拟赛][JZOJ4599]西行妖
- 西行杂感
- 西行归来
- 西行散记20070324
- 西行青藏新
- 美利坚西行记--序言
- 西行漫记
- 西行漫记(1):班加罗尔印象
- 西行漫记(4):周末
- 西行漫记(6):Diversity
- 西行漫记(10):加利福尼亚男孩
- 西行漫记(11):数字化敏捷
- 西行漫记(13):Show Time
- surcharge
- 暑期二(J)(hdu2050)
- Python编写Oracle和Elasticsearch数据同步脚本
- 守护进程
- 消除游戏解析
- 西行妖
- Javascript对象继承
- 解决 Sublime text3 中文显示乱码问题【亲测可用】
- google guava使用介绍
- H5学习笔记
- Js实现文件上传无刷新以及图片预览
- 搜索引擎研究---网络蜘蛛程序算法相关资料 Part I (共5部分)
- ContextLoaderListener理解
- Android:LinearLayout布局中Layout_weight的深刻理解