洛谷 4099 [HEOI2013]SAO——树形DP
题目:https://www.luogu.org/problemnew/show/P4099
结果还是看了题解才会……
关键是状态,f[ i ][ j ] 表示 i 子树、 i 号点是第 j 个出现的方案数。
合并的时候,很重要的是去枚举孩子 v 有 k 个点放在了第 i 个点前面。这样 v 可以在的位置就根据该边是 > 还是 < 而是一个前/后缀。这样就是 n2 的了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mn(int a,int b){return a<b?a:b;}
const int N=,mod=1e9+;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;} int n,siz[N],c[N][N],f[N][N],pr[N][N],sc[N][N];
int hd[N],xnt,to[N<<],nxt[N<<];bool lx[N<<];//1:<
char ch;
void add(int x,int y,bool fx)
{ to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;lx[xnt]=fx;}
void dfs(int cr,int fa)
{
siz[cr]=; f[cr][]=;//
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa)
{
dfs(v,cr); siz[cr]+=siz[v];
for(int j=siz[cr];j;j--)
{
int lj=;
for(int k=,l2=Mn(j-,siz[v]);k<=l2;k++)
{
int tp=;
if(lx[i]) tp=(ll)f[cr][j-k]*sc[v][k+]%mod;
else tp=(ll)f[cr][j-k]*pr[v][k]%mod;
tp=(ll)tp*c[j-][k]%mod*c[siz[cr]-j][siz[v]-k]%mod;
lj=upt(lj+tp);
}
f[cr][j]=lj;
}
}
pr[cr][]=sc[cr][siz[cr]+]=;///
for(int j=;j<=siz[cr];j++)
{
pr[cr][j]=upt(pr[cr][j-]+f[cr][j]);
}
for(int j=siz[cr];j;j--)
{
sc[cr][j]=upt(sc[cr][j+]+f[cr][j]);
}
pr[cr][]=sc[cr][siz[cr]+]=;
}
int main()
{
int T=rdn(),lm=;
for(int i=;i<=lm;i++)c[i][]=;
for(int i=;i<=lm;i++)
for(int j=;j<=i;j++)
c[i][j]=upt(c[i-][j]+c[i-][j-]);
while(T--)
{
n=rdn(); memset(hd,,sizeof hd); xnt=;
for(int i=,u,v;i<n;i++)
{
u=rdn()+;cin>>ch;v=rdn()+;
add(u,v,ch=='<'); add(v,u,ch=='>');
}
dfs(,);
printf("%d\n",sc[][]);
}
return ;
}
洛谷 4099 [HEOI2013]SAO——树形DP的更多相关文章
- 洛谷P4099 [HEOI2013]SAO(树形dp)
		
传送门 HEOI的题好珂怕啊(各种意义上) 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关) 我们考虑 ...
 - 洛谷 P4099 - [HEOI2013]SAO(树形 dp)
		
题面传送门 题意: 有一个有向图 \(G\),其基图是一棵树 求它拓扑序的个数 \(\bmod (10^9+7)\) \(n \in [1,1000]\) 如果你按照拓扑排序的方法来做,那恐怕你已经想 ...
 - 洛谷$P4099\ [HEOI2013]\ SAO\ dp$
		
正解:树形$dp$ 解题报告: 传送门$QwQ$. 考虑设$f_i$表示点$i$的子树内的拓扑序排列方案数有多少个. 发现这样不好合并儿子节点和父亲节点.于是加一维,设$f_{i,j}$表示点$i$的 ...
 - [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
		
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
 - 3167: [Heoi2013]Sao [树形DP]
		
3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...
 - C++ 洛谷 2014 选课 from_树形DP
		
洛谷 2014 选课 没学树形DP的,看一下. 首先要学会多叉树转二叉树. 树有很多种,二叉树是一种人人喜欢的数据结构,简单而且规则.但一般来说,树形动规的题目很少出现二叉树,因此将多叉树转成二叉树就 ...
 - $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
		
洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...
 - [洛谷P2016] 战略游戏 (树形dp)
		
战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...
 - 洛谷P2607 [ZJOI2008]骑士(树形dp)
		
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
 
随机推荐
- 测开之路八十三:高级函数:map()和filter()
			
# map(函数名,可迭代对象)# 给可迭代对象的每个值+5l = list(range(1, 21)) def add_number(x): return x + 5 # 第一种方式print ...
 - Js定义一个表单并提交
			
Js定义一个表单 var form = $("<form>"); //定义一个form表单 form.attr('style', 'display:none'); // ...
 - IrfanView - 图片浏览、编辑、批处理神器
			
picasa 停止更新后,需要一款合适的替代品.比较了一番后,选定了 IrfanView. 1. 安装 从 官方网站 下载安装即可,软件只有几兆大小. 2. 常用快捷键 所有快捷键可以参考 这里. I ...
 - redis连接报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to...
			
连接redis报错: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persis ...
 - PTA 1067 Sort with Swap(0, i) (贪心)
			
题目链接:1067 Sort with Swap(0, i) (25 分) 题意 给定长度为 \(n\) 的排列,如果每次只能把某个数和第 \(0\) 个数交换,那么要使排列是升序的最少需要交换几次. ...
 - Spring Security 01
			
环境搭建 maven依赖jar包 <!-- spring-security --> <dependency> <groupId>org.springframewor ...
 - Map遍历方式
			
entrySet 推荐 最常用,性能很好 示例: for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out ...
 - java中关于异常的处理
			
初学java的时候,当我们碰到异常时,一般会把异常直接throws抛出去,或则在catch的时候,简单的写一句打印异常信息,但是在实际开发中,是不能这么做的.如果我们将底层的某一个异常简单的print ...
 - Go语言_流程控制语句:for、if、else、switch 和 defer
			
流程控制语句:for.if.else.switch 和 defer 学习如何使用条件.循环.分支和推迟语句来控制代码的流程. Go 作者组编写,Go-zh 小组翻译. https://go-zh.or ...
 - Spring学习笔记(3)——快速入门
			
项目目录如下: Say.java为主函数通过ApplicationContext创建对象,利用方法ClassPathXmlApplicationContext访问配置文件Applicationcont ...