树dp

定义f[i][j]为i在其已合并子树内排名为j的方案数

O(n2)进行子树合并

转移时枚举他在已合并子树中的排名j和新合并子树中的排名k+1

当他比他儿子大的时候$f[x][j+k]=f[x][j]*{\sum{_{i}^{k}}}f[son][i]*C{_{j+k-1}^{j-1}}*C{_{size[x]+size[son]-j-k}^{size[x]-j}}$

后面两个组合数可以看作是有j+k-1个比他小的要选出j-1个放原子树中的,剩下的放新子树中的,后面就是比他大的,同理

当他比他儿子小的时候只需要把前缀和转化成后缀和即可。

代码

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define mod 1000000007
#define LL long long
#define N 1050
using namespace std;
int e=,head[N];
struct edge{
int v,w,next;
}ed[*N];
void add(int u,int v,int w){
ed[e].v=v;ed[e].w=w;
ed[e].next=head[u];
head[u]=e++;
}
LL C[N][N],f[N][N],sum[N][N],g[N];
int fa[N],size[N];
void dfs(int x){
size[x]=;f[x][]=;
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
if(v==fa[x])continue;
fa[v]=x;dfs(v);
for(int j=;j<=size[x]+size[v];j++)g[j]=;
for(int j=;j<=size[x];j++){
for(int k=;k<=size[v];k++){
if(ed[i].w==)
(g[j+k]+=f[x][j]*sum[v][k]%mod*C[j+k-][j-]%mod*C[size[x]+size[v]-j-k][size[x]-j]%mod)%=mod;
else
(g[j+k]+=f[x][j]*(sum[v][size[v]]-sum[v][k]+mod)%mod*C[j+k-][j-]%mod*C[size[x]+size[v]-j-k][size[x]-j]%mod)%=mod;
}
}
size[x]+=size[v];
for(int j=;j<=size[x];j++)f[x][j]=g[j];
}
for(int i=;i<=size[x];i++)
sum[x][i]=(sum[x][i-]+f[x][i])%mod;
}
void init(){
e=;
memset(head,,sizeof head);
memset(sum,,sizeof sum);
memset(size,,sizeof size);
memset(fa,,sizeof fa);
memset(f,,sizeof f);
}
int n;
char getc(){
char ch=getchar();
while((ch!='<')&&(ch!='>'))ch=getchar();
return ch;
}
signed main(){
int T;
scanf("%d",&T);
for(int i=;i<=;i++){
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
}
while(T--){
init();
scanf("%d",&n);
for(int i=,u,v;i<n;i++){
scanf("%d",&u);char ch=getc();scanf("%d",&v);
u++;v++;
if(ch=='<'){add(u,v,);add(v,u,);}
if(ch=='>'){add(u,v,);add(v,u,);}
}
dfs();
printf("%lld\n",sum[][size[]]);
}
return ;
}

bzoj3167

bzoj 3167 SAO的更多相关文章

  1. [BZOJ 3167][HEOI 2013]SAO

    [BZOJ 3167][HEOI 2013]SAO 题意 对一个长度为 \(n\) 的排列作出 \(n-1\) 种限制, 每种限制形如 "\(x\) 在 \(y\) 之前" 或 & ...

  2. BZOJ 3167: [Heoi2013]Sao

    3167: [Heoi2013]Sao Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 36[Submit][Status][D ...

  3. BZOJ 3167 [Heoi2013]Sao ——树形DP

    BZOJ4824的强化版. 改变枚举的方案,使用前缀和进行DP优化. 然后复杂度就是$O(n^2)$了. #include <map> #include <cmath> #in ...

  4. bzoj 4824: [Cqoi2017]老C的键盘

    Description 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...

  5. [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...

  6. 3167: [Heoi2013]Sao [树形DP]

    3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...

  7. 【BZOJ3167】[HEOI2013]SAO(动态规划)

    [BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][ ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. js定义数组的方法

    1.定义时赋值 var mycars=new Array("a","b","c") 2.new一个数组对象 var mycars=new A ...

  2. Roundcube Webmail File Disclosure Vulnerability(CVE-2017-16651)

    Preface Software: https://roundcube.net/ Versions: 1.1.0 - 1.1.9, 1.2.0 - 1.2.6, 1.3.0 - 1.3.2 CVE: ...

  3. Hadoop的多节点集群启动,唯独没有namenode进程?(血淋淋教训,一定拍快照)(四十五)

    前言 大家在搭建hadoop集群时,第一次格式化后,一路要做好快照.别随便动不动缺少什么进程,就来个格式化. 问题描述:启动hadoop时报namenode未初始化:java.io.IOExcepti ...

  4. java深入浅出之数据结构

    1.整形数据 byte.short.int.long,分别是1248个字节的存储量,取值范围也是依次增大的,其中int是正负21亿多: long a = 1111222233334444L:记住后面要 ...

  5. Flask类的属性和方法大全

    Flask Property__class____dict____doc____module__app_ctx_globals_classconfig_classdebugdefault_config ...

  6. FOF 全面科普贴(转载)

    看过那么多 FOF 科普贴,这份最全面!告转之~ 来自:https://xueqiu.com/7692591808/81852994 [ 导言 ] 看过那么多FOF科普贴,这份最全面! 昨天下午,青果 ...

  7. 将Excel表中的数据导入到数据库

    网上查到的有参考价值的就一家,自己调试发现可行.感谢原创文章:将Excel中数据导入数据库(一) using System; using System.Collections.Generic; usi ...

  8. 常用域名记录解释:A记录、MX记录、CNAME记录、TXT记录、AAAA记录、NS记录

    A记录 A记录是用来创建到IP地址的记录. A记录设置技巧 1.如果想创建不带www的记录,即ezloo.com,在主机记录中填写@或者留空,不同的注册商可能不一样. 2.创建多个域名到同一个IP,比 ...

  9. Linux的一些问题

    2. VMware11安装deepin15 实现文件共享和屏幕分辨率放大 要点:安装 open-vm-tools open-vm-tools-desktop open-vm-tools-dkms  这 ...

  10. numpy用法归纳

    1.生成数组 import numpy as np 把python列表转换为数组 >>> np.array([1, 2, 3]) array([1, 2, 3]) 把python的r ...