[HEOI2013]SAO
题目大意:
一个有向无环图上有n个结点,
现在告诉你n-1个条件(x,y),表示x和y的先后关系。
问原图共有几种可能的拓扑序?
思路:
树形DP。
f[i][j]表示对于第i个结点,有j个点在它前面的方案数。
设当前结点为x,后面有一个结点为y,原本x前有i个结点,y前有j个结点,我们可以得到状态转移方程:
f[x][size[x]-i+size[y]-j]+=f[x][size[x]-i]*c[i+j][i]*c[size[x]-i+size[y]-j][size[y]-j]*((sum[y][size[y]]-sum[y][size[y]-j]+mod)%mod);
其中c是预处理好的组合数,sum是f数组的前缀和。
同样对于y在x前面的情况,状态转移方程如下:
f[x][i+j]+=f[x][i]*c[i+j][i]*c[size[x]-i+size[y]-j][size[y]-j]*sum[y][j];
最后就是求f[root][0]~f[root][n-1]的和,也就是sum[root][n]。
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,mod=1e9+;
struct Edge {
int to;
bool type;
};
std::vector<Edge> e[N];
inline void add_edge(const int &u,const int &v,const bool &type) {
e[u].push_back((Edge){v,type});
e[v].push_back((Edge){u,!type});
}
int c[N][N];
inline void prep() {
for(register int i=;i<N;i++) {
c[i][]=;
for(register int j=;j<=i;j++) {
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
}
}
int f[N][N],sum[N][N],size[N];
inline void init() {
memset(f,,sizeof f);
for(register int i=;i<N;i++) {
e[i].clear();
}
}
void dp(const int &x,const int &par) {
size[x]=;
f[x][]=;
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i].to;
if(y==par) continue;
dp(y,x);
static int g[N];
memset(g,,sizeof g);
if(e[x][i].type) {
for(register int i=;i<=size[x];i++) {
for(register int j=;j<=size[y];j++) {
g[size[x]-i+size[y]-j]
+=(int64)f[x][size[x]-i]
*c[i+j][i]%mod
*c[size[x]-i+size[y]-j][size[y]-j]%mod
*((sum[y][size[y]]-sum[y][size[y]-j]+mod)%mod)%mod;
g[size[x]-i+size[y]-j]%=mod;
}
}
} else {
for(register int i=;i<=size[x];i++) {
for(register int j=;j<=size[y];j++) {
g[i+j]
+=(int64)f[x][i]
*c[i+j][i]%mod
*c[size[x]-i+size[y]-j][size[y]-j]%mod
*sum[y][j]%mod;
g[i+j]%=mod;
}
}
}
size[x]+=size[y];
memcpy(f[x],g,sizeof g);
}
size[x]++;
for(register int i=;i<=size[x];i++) {
sum[x][i]=(sum[x][i-]+f[x][i-])%mod;
}
}
int main() {
prep();
for(register int T=getint();T;T--) {
init();
const int n=getint();
for(register int i=;i<n;i++) {
const int u=getint(),sign=getchar(),v=getint();
add_edge(u,v,sign=='<');
}
dp(,-);
printf("%d\n",sum[][n]);
}
return ;
}
[HEOI2013]SAO的更多相关文章
- 3167: [Heoi2013]Sao [树形DP]
3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...
- 【BZOJ3167】[HEOI2013]SAO(动态规划)
[BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][ ...
- P4099 [HEOI2013]SAO
P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...
- BZOJ 3167: [Heoi2013]Sao
3167: [Heoi2013]Sao Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 96 Solved: 36[Submit][Status][D ...
- P4099 [HEOI2013]SAO(树形dp)
P4099 [HEOI2013]SAO 我们设$f[u][k]$表示以拓扑序编号为$k$的点$u$,以$u$为根的子树中的元素所组成的序列方案数 蓝后我们在找一个以$v$为根的子树. 我们的任务就是在 ...
- 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘
[BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...
- [HEOI2013]SAO(树上dp,计数)
[HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...
- 【做题记录】 [HEOI2013]SAO
P4099 [HEOI2013]SAO 类型:树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博 ...
- [HEOI2013]SAO ——计数问题
题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
随机推荐
- js刷题:leecode 25
原题:https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意就是给你一个有序链表.如1->2->3->4->5,还 ...
- PHP对象4: final 不允许重写方法或不允许继承类
final用在方法中,能继承方法, 不允许重写方法 final用在类声名中, 此类就不能继承 <?php class A{ final function say(){ say 'Ok<br ...
- Mysql储存过程5: while
循环结构 while create procedure name() begin while 条件 do SQL语句 end while; end$ create procedure aa6() be ...
- Qualcom QMI系列-基本知识介绍(转)
1 引言1.1 编写目的 介绍Qualcom QMI 基本知识,API使用,设计原理,基于QMI的RemoteEfs(NV)分析1.2 阅读建议 高通平台入门1.3 参考资料 ...
- 64_s2
sipwitch-1.9.15-3.fc26.x86_64.rpm 13-Feb-2017 09:19 162822 sipwitch-cgi-1.9.15-3.fc26.x86_64.rpm 13- ...
- JS时间转换的一个坑位
在做项目的时候,无意发现了一个小东西. new Date('2018-05-15') new Date('2018-5-15') 输出的结果是不同的,相差了8小时.然后让我回忆到之前看的一个时间转换函 ...
- 「pycaffe指南」使用caffe的NetSpec.py中的Python接口自动生成×.prototxt文件
https://www.jianshu.com/p/1a420445deea 作者:MapReducer 链接:https://www.jianshu.com/p/1a420445deea 來源:简书 ...
- shell脚本执行方式
# BY THE WAY, 其实这块内容算是比较简单的,但是都比较常记得它最基本的两种方式,另外两种却忘记了 1. 利用sh或bash命令执行 sh test.sh bash test.sh 2. 在 ...
- Eloqument 学习
参考地址:https://d.laravel-china.org/docs/5.5/eloquent#mass-assignment
- [ python ] 面向对象 - 选课系统
根据源程序进行改写: 原程序地址:http://www.cnblogs.com/lianzhilei/p/5985333.html 如有侵权立即删除. 感谢原作者将完整的代码提供参考. ...