problem

luogu-P4099

solution

两篇前提题解:排列计数,老C的键盘

想必已经看了 CQOI2017 老C的键盘 一题题解了。

这里直接考虑优化状态转移方程。

我们发现 f(u,i),f(v,j)f(u,i),f(v,j)f(u,i),f(v,j),当枚举 jjj 后,对应的 kkk 是一段连续区间。

f(u,i)∗f(v,j)∗(k−1i−1)∗(sizu+sizv−ksizu−i)f(u,i)*f(v,j)*\binom{k-1}{i-1}*\binom{siz_u+siz_v-k}{siz_u-i}f(u,i)∗f(v,j)∗(i−1k−1​)∗(sizu​−isizu​+sizv​−k​) 转移贡献变化的只有 kkk,且有两项都与之挂钩。

我们不妨反过来固定 kkk,能转移到这个 kkk 的肯定也是一段连续的 jjj。

所以我们求出来 f(v,j)f(v,j)f(v,j) 后,直接做个前缀和,f(v,j)=∑j′≤jf(v,j′)f(v,j)=\sum_{j'\le j}f(v,j')f(v,j)=∑j′≤j​f(v,j′)。

以要求 hu<hvh_u<h_vhu​<hv​ 为例。

其原来是 i+j≤k≤i+sizvi+j\le k\le i+siz_vi+j≤k≤i+sizv​,固定 i,ki,ki,k 后,能转移过来的 jjj 范围则为 1∼k−i1\sim k-i1∼k−i。

另一种则是 k−i<j≤sizvk-i<j\le siz_vk−i<j≤sizv​。

两种的 kkk 范围也稍稍不同。

具体可以看代码实现。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 1005
char s[5];
int n;
int c[maxn][maxn], f[maxn][maxn], g[maxn], siz[maxn];
vector < pair < int, int > > G[maxn];void dfs( int u, int fa ) {f[u][1] = siz[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;if( v == fa ) continue;dfs( v, u );memcpy( g, f[u], sizeof( f[u] ) );memset( f[u], 0, sizeof( f[u] ) );for( int i = 1;i <= siz[u];i ++ )if( w ) {for( int k = i + 1;k <= i + siz[v];k ++ )(f[u][k] += f[v][k - i] % mod * g[i] % mod * c[k - 1][i - 1] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}else {for( int k = i;k < i + siz[v];k ++ )(f[u][k] += (f[v][siz[v]] - f[v][k - i]) % mod * g[i] % mod * c[k - 1][i - 1] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}siz[u] += siz[v];}for( int i = 1;i <= siz[u];i ++ ) (f[u][i] += f[u][i - 1]) %= mod;
}signed main() {for( int i = 0;i <= 1000;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;}int T;scanf( "%lld", &T );while( T -- ) {scanf( "%lld", &n );memset( f, 0, sizeof( f ) );for( int i = 0;i < n;i ++ ) G[i].clear();for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %s %lld", &u, s, &v );G[u].push_back( make_pair( v, s[0] == '<' ) );G[v].push_back( make_pair( u, s[0] == '>' ) );}dfs( 0, 0 );printf( "%lld\n", ( f[0][n] + mod ) % mod );}return 0;
}

[HEOI2013] SAO(dp + 组合数 + 前缀和)相关推荐

  1. [APIO2016] 划艇(dp + 组合数 + 前缀和优化)

    problem luogu-P3643 solution 有个显然的暴力 dpdpdp.设 dp(i,j):dp(i,j):dp(i,j): 到了第 iii 个学校,其参加且派出 jjj 个划艇的方案 ...

  2. [CQOI2017] 老C的键盘(树形dp + 组合数)

    problem luogu-P3757 solution observation:\text{observation}:observation: hi/2−hih_{i/2}-h_ihi/2​−hi​ ...

  3. 【做题记录】 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 类型:树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博 ...

  4. 洛谷P4099 [HEOI2013]SAO 题解

    洛谷P4099 [HEOI2013]SAO 题解 题目链接:P4099 [HEOI2013]SAO 题意: Welcome to SAO ( Strange and Abnormal Online). ...

  5. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  6. Luogu4099 HEOI2013 SAO 组合、树形DP

    传送门 值得注意的是一般的DAG的拓扑序列数量是NP问题,所以不能直接入手 题目中给出的图可以看做是一个树形图,虽然方向比较迷.考虑使用树形图的性质 不妨任选一个点为根做树形DP,注意到数的位置与方案 ...

  7. bzoj3167[HEOI2013]SAO

    这虽然是游戏,但可不是闹着玩的. --茅场晶彦 HEOI2013有一道SAO和一道ALO--SwordArtOnline和AlfheimOnline233333 一开始看到这道题,我觉得noip模拟赛 ...

  8. 「APIO2016」划艇 (dp+组合数+区间离散化)(考试)

    题干: 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 N 个划艇学校,编号依次为 1 到 N.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同. ...

  9. 划艇:dp/组合数/区间离散化

    Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 N 个划艇学校,编号依次为 1 到 N.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划 ...

最新文章

  1. python开发需要掌握哪些知识-Python的8个基础知识点,新手必须背下来!
  2. java解析XML获取城市代码
  3. 二十八、深入浅出Python中的 logging模块
  4. Go报错package github.com/astaxie/beego: exit status 128
  5. SAP WebIDE的本地安装方式
  6. 为什么机器人企业的算法工程师需要ROS开发经验
  7. 请编写一个程序,使用字典存储学生信息,学生信息包括学号和姓名,请根据学号从小到大的顺序输出学生的信息。
  8. html文本格式化意思,HTML文本格式化标签(Formatting)
  9. C语言之原码、反码和补码
  10. tornado-ioloop-async-io
  11. HCIE-Security Day25:DSPN+NHRP+Mgre:实验(四)配置shortcut方式DSPN(OSPF路由协议)
  12. 使用ExtendSim进行物流、供应链和运输建模仿真
  13. MFC实现FTP服务器和FTP客户端
  14. ZUCC_数据库系统概论实验_实验五 JDBC进阶 2
  15. Java可以hook微信吗,Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)
  16. Win10Pcap驱动部分学习
  17. dd命令测试磁盘读写速度
  18. Android蓝牙开发系列文章-蓝牙mesh(一)
  19. 微信小程序实现首页图片多种排版布局!
  20. SSIS - 1.简介

热门文章

  1. 计算机语言平均数怎么算,使用python怎么求三个数的平均值
  2. html图片宽度高度等比例绽放,css图片自动绽放大小,左右,上下居中
  3. 用android ndk编译ffmpeg,AndroidNDK交叉编译FFMPEG
  4. html5 控制鼠标移动,HTML5 Canvas随鼠标移动的引力粒子群
  5. python与matlab混合编程_python 与 matlab 混编
  6. java跳转画面后画面白了_如何跳转指定页面后再次跳转到另一页面或原来的页面...
  7. 获取两个数据的交集_MySQL交集和差集的实现方法
  8. 邮箱通知php,PHPMailer 发送邮件(含详细介绍及使用方法说明)
  9. leetcode206. 反转链表
  10. 10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例