BZOJ4835 [Lydsy2017年4月月赛]遗忘之树
来源:互联网 发布:上海网站推广优化公司 编辑:程序博客网 时间:2024/05/21 15:50
f[x]表示分治树以x为根的子树的情况数
f[x]就等于对于每个分治儿子y,f[y]*siz[y]的乘积
但是注意到如果有两个重心他要求最小那个
所以如果有一个分治子树大小恰好等于本身子树大小/2,那么对于这个子树乘的就是f[y]*siz(y,x),siz(y,x)代表y的分治子树内标号比x大的点的个数
因为分支结构的树高是log的,所以sigma 子树大小也是log的(因为sigma 子树大小=sigma 点深度),所以暴力求siz(y,x)即可
#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 100010#define MAXM 1010#define ll long long#define eps 1e-8#define MOD 1000000007#define INF 1000000000struct vec{int to;int fro;};vec mp[MAXN];int tai[MAXN],cnt;bool cr[MAXN];int n;ll f[MAXN],siz[MAXN];int mn[MAXN];inline void be(int x,int y){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;}int count(int x,int lim){int i,y;int re=0;if(x>lim){re++;}for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;re+=count(y,lim);}return re;}void dfs(int x){int i,y;f[x]=siz[x]=1;mn[x]=x;for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;dfs(y);siz[x]+=siz[y];mn[x]=min(mn[x],mn[y]);}for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;if((siz[x]&1^1)&&(siz[y]==siz[x]>>1)){(f[x]*=f[y]*count(y,x)%MOD)%=MOD;}else{(f[x]*=f[y]*siz[y]%MOD)%=MOD;}}}int main(){int i,x,y;int tmp;scanf("%d",&tmp);while(tmp--){scanf("%d%*d",&n);cnt=0;for(i=1;i<=n;i++){tai[i]=0;cr[i]=1;}for(i=1;i<n;i++){scanf("%d%d",&x,&y);cr[y]=0;be(x,y);}for(i=1;i<=n;i++){if(cr[i]){dfs(i);printf("%lld\n",f[i]);break;}}}return 0;}/*16 53 44 53 66 11 2*/
0 0
- BZOJ4835 [Lydsy2017年4月月赛]遗忘之树
- 4835: [Lydsy2017年4月月赛]遗忘之树
- [bzoj4835]遗忘之树
- [Lydsy2017年4月月赛]抵制克苏恩
- [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4832 [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4836 [Lydsy2017年4月月赛]二元运算
- BZOJ 4801([Lydsy2017年4月月赛]打牌-分类讨论)
- [BZOJ]4832: [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4837 [Lydsy2017年4月月赛]LRU算法
- 4836: [Lydsy2017年4月月赛]二元运算
- 4833: [Lydsy2017年4月月赛]最小公倍佩尔数
- 4831: [Lydsy2017年4月月赛]序列操作
- 4833: [Lydsy2017年4月月赛]最小公倍佩尔数 数论变换
- bzoj 4831: [Lydsy2017年4月月赛]序列操作
- 概率DP [Lydsy2017年4月月赛]抵制克苏恩
- [bzoj-4832][Lydsy2017年4月月赛]抵制克苏恩 题解
- BZOJ4882: [Lydsy2017年5月月赛]卡常生成树
- HDU 3555 Bomb (数位DP)
- 链表的操作(未解决,排序后无法正确进行插入和删除)
- myeclipse使用jta遇到Error in init: Log already in use? tmlog in ./\错误
- Java操作redis集群和主从
- 银行ATM存取款机系统
- BZOJ4835 [Lydsy2017年4月月赛]遗忘之树
- Javascript获取指定日期
- 洛谷 1087——FBI树
- php清除BOM
- python环境配置和包安装时候可能会用到的命令
- MySQL
- SQL Server统计表的行数
- 士兵杀敌(三)(区间求最值)
- NYOJ 746 整数划分(四) (区间dp)