[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 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
随机推荐
- jquery实现简单轮播
先上简单的html代码 <!DOCTYPE HTML> <html> <head> <link rel="stylesheet" type ...
- Django之组合搜索组件(一)
什么是组合搜索呢? 比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色 ...
- .net APIHelper client获取数据
using Newtonsoft.Json; using System.Net.Http.Headers; public static class APIHepler { public static ...
- 无key值的json数组解析
[ [ { "cartId": 9223, "factoryId": 143, ...
- 自己看之区间DP
//菜鸡制作,看的时候可能三目运算符略烦;;; 区间DP入门题:Brackets 地址:http://59.77.139.92/Problem.jsp?pid=1463 分析(对区间DP的代码原理进行 ...
- elk系列3之通过json格式采集Nginx日志【转】
转自 elk系列3之通过json格式采集Nginx日志 - 温柔易淡 - 博客园http://www.cnblogs.com/liaojiafa/p/6158245.html preface 公司采用 ...
- caffe Python API 之图片预处理
# 设定图片的shape格式为网络data层格式 transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) ...
- nginx location 指令意义
基本语法:location [=|~|~*|^~] /uri/ { … } = 严格匹配.如果这个查询匹配,那么将停止搜索并立即处理此请求.~ 为区分大小写匹配(可用正则表达式)!~为区分大小写不匹配 ...
- C/C++——库函数strcpy和strdup比较
版权声明:原创文章,禁止转载. 1. strcpy 原型: extern char *strcpy(char *dest,char *src); 用法: #include <string.h&g ...
- HDU 2594 Simpsons’ Hidden Talents(KMP求s1前缀和s2后缀相同部分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 题目大意:给两串字符串s1,s2,,找到最长子串满足既是s1的前缀又是s2的后缀,输出子串,及相 ...