【做题记录】 [HEOI2013]SAO

P4099 [HEOI2013]SAO

类型:树形 \(\text{DP}\)

这里主要补充一下 \(O(n^3)\)\(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博客(题解)。

\(f[x][p]\) 表示在以 \(x\) 为根的子树中,\(x\) 在拓扑序排在第 \(p\) 个时的方案数。

转移中设 \(x\) 在已经合并的拓扑序中排名为 \(p_1\) ,将要合并的子树(以 \(ver\) 为根)中 \(ver\) 排名为 \(p_2\) ,合并后 \(x\) 排名为 \(p_3\)

列出转移方程:(为了表示方便略去了取模操作)

  • \(x < ver\)\(x\) 应在 \(ver\) 之前,\(p_1<p_2\)
for(p1 = [1,siz[x]])for(p2 = [1,siz[ver]])for(p3 = [p1,p1+p2-1])f[x][p3]+=f[x][p1]*f[ver][p2]*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];
  • \(x > ver\)\(x\) 应在 \(ver\) 之后,\(p_1>p_2\)
for(p1 = [1,siz[x]])for(p2 = [1,siz[ver]])for(p3 = [p1+p2,siz[x]+siz[ver]])f[x][p3]+=f[x][p1]*f[ver][p2]*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];

(更直观的转移方程:)

\[f[x][p3]+=f[x][p1]\times f[ver][p2]\times C_{p3-1}^{p1-1}\times C_{siz[x]+siz[ver]-p3}^{siz[x]-p1} \]

到此为止,你可以得到 \(40pts\) 的好成绩。

交换内外循环

可以观察到 \(p_2\) 在转移方程中只出现了一次,因此我们将 \(p_2\)\(p_3\) 的循环交换,列出转移方程:

  • \(x < ver\)\(x\) 应在 \(ver\) 之前,\(p_1<p_2\)
for(p1 = [1,siz[x]])for(p3 = [p1,p1+siz[ver]-1])for(p2 = [p3-p1+1,siz[ver]])f[x][p3]+=f[x][p1]*f[ver][p2]*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];
  • \(x > ver\)\(x\) 应在 \(ver\) 之后,\(p_1>p_2\)
for(p1 = [1,siz[x]])for(p3 = [p1+1,p1+siz[ver]])for(p2 = [1,p3-p1])f[x][p3]+=f[x][p1]*f[ver][p2]*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];

前缀和优化去掉一层循环

通过上一步的交换,发现 \(f[x][p3]\) 累加中的 \(p2\) 是一段连续的,并且满足乘法结合律,联想到前缀和优化。

\(g[x][p]\) 表示在以 \(x\) 为根的子树中,\(x\) 在拓扑序排在 \(p\) 个时的方案数之和。

那么转移方程变为:

  • \(x < ver\)\(x\) 应在 \(ver\) 之前,\(p_1<p_2\)
for(p1 = [1,siz[x]])for(p3 = [p1,p1+siz[ver]-1])g[x][p3]+=g[x][p1]*(g[ver][siz[ver]]-g[ver][p3-p1])*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];
  • \(x > ver\)\(x\) 应在 \(ver\) 之后,\(p_1>p_2\)
for(p1 = [1,siz[x]])for(p3 = [p1+1,p1+siz[ver]])g[x][p3]+=g[x][p1]*g[ver][p3-p1]*c[p3-1][p1-1]*c[siz[x]+siz[ver]-p3][siz[x]-p1];

记得在最后加上:

for(int i=1;i<=siz[x];i++) g[x][i]+=g[x][i-1];

所以这道题 \(AC\) 了。

注:转移中为了维持方程的无后效性,应将 \(f\) 数组备份一遍。

\(100pts\) 完整代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define Maxn 1005
#define mod 1000000007
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int t,n,tot;
int dp[Maxn][Maxn],tmp[Maxn],c[Maxn][Maxn],siz[Maxn];
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1],edg[Maxn<<1];
void add(int x,int y,int d)
{ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot,edg[tot]=d;
}
void dfs(int x,int fa)
{siz[x]=1,dp[x][1]=1;for(int i=hea[x];i;i=nex[i]){if(ver[i]==fa) continue;dfs(ver[i],x);memcpy(tmp,dp[x],sizeof(dp[x]));memset(dp[x],0,sizeof(dp[x]));if(edg[i])for(int p1=1;p1<=siz[x];p1++)for(int p3=p1;p3<=siz[ver[i]]+p1-1;p3++)dp[x][p3]=(dp[x][p3]+1ll*tmp[p1]*(dp[ver[i]][siz[ver[i]]]-dp[ver[i]][p3-p1]+mod)%mod*c[p3-1][p1-1]%mod*c[siz[x]+siz[ver[i]]-p3][siz[x]-p1]%mod)%mod;elsefor(int p1=1;p1<=siz[x];p1++)for(int p3=p1+1;p3<=siz[ver[i]]+p1;p3++)dp[x][p3]=(dp[x][p3]+1ll*tmp[p1]*dp[ver[i]][p3-p1]%mod*c[p3-1][p1-1]%mod*c[siz[x]+siz[ver[i]]-p3][siz[x]-p1]%mod)%mod;siz[x]+=siz[ver[i]];}for(int i=1;i<=siz[x];i++) dp[x][i]=(dp[x][i]+dp[x][i-1])%mod;
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);c[1][0]=c[0][0]=1;for(int i=1;i<=1000;i++,c[i][0]=1)for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;t=rd();char c;while(t--){n=rd();memset(hea,0,sizeof(hea)),tot=0;memset(siz,0,sizeof(siz));for(int i=1,x,y;i<n;i++){x=rd()+1,cin>>c,y=rd()+1;add(x,y,c=='<'),add(y,x,c=='>');}dfs(1,0);printf("%d\n",dp[1][n]);}//fclose(stdin);//fclose(stdout);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF25E-Test【AC自动机,bfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF25E 题目大意 给出三个串&#xff0c;然后求一个最短的串包含这三个串。 1≤∣s1∣,∣s2∣,∣s3∣≤1051\leq |s_1|,|s_2|,|s_3|\leq 10^51≤∣s1​∣,∣s2​∣,∣s3​∣≤105 解题思路 把三个串状压&#xff0c;先跑出AC…

微软开源的Trill是什么?

以下是一篇15年的文章的译文&#xff1a;https://dwainegilmer.wordpress.com/2015/01/28/microsoft-trill-for-streaming-analytics-from-microsoft-research/当今许多大数据应用程序套件的重点是数据存储。它们是围绕狭窄范围的数据集设想和设计的&#xff0c;通常是为了组织…

剪纸游戏(博弈论)(SG函数)

文章目录题目描述解析题目描述 解析 本题的关键就是SG函数的定义 尝试了一些自己直观上可能对但题解没有使用的约定方法&#xff08;当然最后证明都是错的 。。。&#xff09;&#xff0c;对SG的理解更深刻了一些 SG0的含义是无法再移动换句话说也就是再移动也对败局于事无补&…

Fight against involution

题目&#xff1a; 对抗内卷&#xff08;大佬经常说别再卷了&#xff09; 有一门课程n个学生选&#xff0c;期末要写一篇论文每个同学写的字数有一个下限和一个上限&#xff0c;课程的成绩是按学生字数的排名来给分的&#xff0c;排名越高分数越高&#xff0c;每个同学都想得到…

【做题记录】 [JLOI2011]不等式组

P5482 [JLOI2011]不等式组 超烦人的细节题&#xff01;(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线)。 树状数组的下标是&#xff1a;所有可能出现的数据进行离散化之后的值。 其含义为&#xff1a;当 \(x\) 离散化后值为 \(i\) 时能满足的不等式个数为 \(…

[COCI2017-2018#5] Karte

[COCI2017-2018#5] Karte&#xff0c;简短的代码想到了就AC 这道题是SPJ放心搞 但是我的脑子里面的东西&#xff0c;不用我多说&#xff0c;你们就知道是水和面粉和成的 看招 题 【题目描述】 你有一副共有N张牌的牌&#xff0c;在第i张牌上会有一个数字ai表示在这张牌下面至…

YBTOJ:红与蓝(博弈论)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;这道题的情境对二人来说是不对称的&#xff0c;所以不太好使用SG函数来求解 但直观上也好考虑 利用树的递归性质可以求出每个节点的颜色是否确定 并确定根的颜色是否确定 如果确定是红就随便涂 确定是蓝就-1 关键在于不…

NWERC2020J-Joint Excavation【构造,贪心】

正题 题目链接:https://codeforces.com/gym/103049/problem/J 题目大意 nnn个点mmm条边的一张无向图&#xff0c;选出一条路径后去掉路径上的点&#xff0c;然后将剩下的点分成点数相等的两份使得两份之间没有边连接。 1≤n,m≤21051\leq n,m\leq 2\times 10^51≤n,m≤2105 解…

eShopOnContainers 看微服务④:Catalog Service

服务简介Catalog service&#xff08;目录服务&#xff09;维护着所有产品信息&#xff0c;包括库存、价格。所以该微服务的核心业务为&#xff1a;产品信息的维护库存的更新价格的维护架构模式先看代码结构&#xff08;下图&#xff09;。主要依赖&#xff1a;1、HealthCheck …

【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板

寡人认为C&#xff0c;E都是比较板的题 butD2也太ex了&#xff0c;大大是被那个mod精给弄疯了&#xff0c;我mod了那么多次还是炸了longlong orz 文章目录二维单调队列模板C&#xff1a;Basketball Exercise题目大意题解代码实现D2&#xff1a;Submarine in the Rybinsk Sea (…

Xor Transformation

题目&#xff1a; 给定一个X和Y&#xff0c;对于X每次可以选择一个A&#xff08;0<A<X&#xff09;&#xff0c;使得X X xor A&#xff0c;现在要求在5步内将X变为Y&#xff0c;请输出操作数目&#xff0c;以及每步的A 题解&#xff1a; 我一开始被题目给的样例个迷惑…

【做题记录】DP 杂题

P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心&#xff1a; 吃饭慢的先打饭节约时间&#xff0c; 所以先将人按吃饭时间从大到小排序。 状态&#xff1a; \(f[i][j]\) 表示前 \(i\) 个人&#xff0c;在 \(1号\) 窗口打饭总时间 \(j\) &#xff0c;最早吃完饭的时间。 我们…

YBTOJ:方程的解(组合数学)(插板法)

文章目录题目描述解析代码题目描述 解析 第一感觉&#xff1a;啥都没感觉出来。。。 直接拿动态规划高精做的 但是只能拿40 重新分析一下这道题&#xff1a; g&#xff08;x&#xff09;首先可以拿快速幂很容易的求出来 问题就转化为了**把g(x)个东西分成k份的方案数 其实答案…

CF39C-Moon Craters【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF39C 题目大意 坐标轴上有nnn个圆&#xff0c;给出每个圆的位置cic_ici​和半径rir_iri​。 要求选出最多的圆使得他们不相交&#xff0c;求方案。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 转换为选出最多的不交区…

开源库Magicodes.Storage正式发布

说明Magicodes.Storage&#xff0c;是心莱科技团队提供的统一存储库&#xff0c;相关库均使用.NET标准库&#xff08;netstandard2.0&#xff09;编写&#xff0c;支持.NET Framework以及.NET Core。我们希望&#xff0c;使用了Magicodes.Storage之后&#xff0c;开发者可以很快…

P3389 【模板】高斯消元法

P3389 【模板】高斯消元法 题目&#xff1a; 给定一个线性方程组&#xff0c;对其求解 题解&#xff1a; 还没接触高斯消元时以为是什么神仙算法&#xff0c;接触后发现。。。就是把我们手算线性方程组的方法&#xff0c;写成了代码emm。。。 比如&#xff1a; x-2y3z6 4x…

【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty

传送门 这些天风也温柔&#xff0c;题也温柔 开车啦&#xff01; 文章目录A1&#xff1a;Add on a Tree题意翻译题解证明代码实现B&#xff1a;Count Pairs题意翻译题解代码实现C&#xff1a;Array Beauty题目描述题解代码实现A1&#xff1a;Add on a Tree 题意翻译 给定一棵…

eShopOnContainers 知多少[5]:EventBus With RabbitMQ

1. 引言事件总线这个概念对你来说可能很陌生&#xff0c;但提到观察者&#xff08;发布-订阅&#xff09;模式&#xff0c;你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&am…

USACO Section 4

前言 好久没更新这个系列了&#xff0c;最近闲的无聊写一下。有两题搜索懒得写了。 P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/problem/P2737 解题思路 先只考虑a1a_1a1​&#xff0c;假设我们拼出了www&#xff0c;那么一定能拼出wka1wka_1wka1​…

YBTOJ:数列方案(组合数学)

文章目录题目描述解析代码题目描述 解析 如果它不取等&#xff0c;那就和方程的解这道题一样了&#xff0c;但有了等号就很头疼 如何把等号去掉呢&#xff1f; 定义BiAiiB~i~A~i~iB i A i i那么我们就可以得到&#xff1a;0<B1<B2<...<Bm<mn0<B~1~<B~2~&…