Pre

调了好久好久。\(QAQ\)

高高兴兴的打了一个\(DP\)数组的转移的程序,直接\(T\)掉,后来看了题解发现有优化。

Solution

状态转移有三个部分组成,一个是左右子树,一个是矩形。

依次设置为\(i,j,k\),可以枚举,时间复杂度太高。

新开一个数组,存下当前状态下的\(i+j\)的总答案,时间复杂度\(O(n^2)\),在枚举\(k\),状态转移,时间复杂度\(O(n^2)\)

Code

#include<bits/stdc++.h>
#define ll long long
using namespace std; const int mod = 1000000007, N = 550, M = 1000000 + 5;
int a[N], n, K;
int stk[N], top;
int ch[N][2], fa[N], sz[N];
ll dp[N][N], fac[M], f[N][N];
inline ll Pow (ll u, ll v) {ll tot = 1, base = u;while (v) {if (v % 2 == 1) {tot = tot * base % mod;}base = base * base % mod;v /= 2;}return tot;
}
inline ll C (ll u, ll v) {return fac[u] * Pow (fac[v], mod - 2) % mod * Pow (fac[u - v], mod - 2) % mod;
}
inline void dfs (int p, int v) {sz[p]++;if (ch[p][0]) {dfs (ch[p][0], a[p]);sz[p] += sz[ch[p][0]];}if (ch[p][1]) {dfs (ch[p][1], a[p]);sz[p] += sz[ch[p][1]];}for (int i = 0; i <= K; ++i) {for (int j = 0; j <= K; ++j) {if (i + j > K) {break;}f[p][i + j] = (f[p][i + j] + dp[ch[p][0]][i] * dp[ch[p][1]][j] % mod) % mod;}}for (int i = 0; i <= K; ++i) {if (i > a[p] - v) {break;}for (int j = 0; j <= K; ++j) {if (i + j > K || i + j > sz[p]) {break;}dp[p][i + j] = (dp[p][i + j] + f[p][j] * fac[a[p] - v] % mod * Pow (fac[a[p] - v - i], mod - 2) % mod * C (sz[p] - j, i) % mod) % mod;}}
}
int main () {scanf ("%d%d", &n, &K);fac[0] = 1; f[0][0] = 1; dp[0][0] = 1;for (int i = 1; i <= M - 5; ++i) {fac[i] = fac[i - 1] * i % mod;}for (int i = 1; i <= n; ++i) {scanf ("%d", &a[i]);while (top > 0 && a[stk[top]] > a[i]) {ch[i][0] = stk[top], top--;}if (ch[fa[ch[i][0]]][0] == ch[i][0]) {ch[fa[ch[i][0]]][0] = 0;}else {ch[fa[ch[i][0]]][1] = 0;}fa[ch[i][0]] = i;fa[i] = stk[top];if (fa[i]) {ch[fa[i]][1] = i;}stk[++top] = i;}int rt = 0;for (int i = 1; i <= n; ++i) {if (!fa[i]) {rt = i;break;}}dfs (rt, 0);printf ("%lld\n", dp[rt][K] % mod);return 0;
}

Conclusion

这个优化方法有意思。

转载于:https://www.cnblogs.com/ChiTongZ/p/11224383.html

bzoj2616:SPOJ PERIODNI相关推荐

  1. [BZOJ2616] SPOJ PERIODNI

    [BZOJ2616] SPOJ PERIODNI 题目描述 Solution 这题有个高大上的名字--笛卡尔树DPDPDP. 然而其实就是一个简单的区间DP而已. 设fl,r,jf_{l,r,j}fl ...

  2. bzoj2616 SPOJ PERIODNI 笛卡尔树+DP

    题目分析 建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度. 设f(x,i)f(x,i)f(x,i)表示以xxx为跟的子树中放 ...

  3. 笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

    文章目录 笛卡尔树 介绍 例题 Largest Submatrix of All 1's 应用 「POI2015」洗车 Myjnie [AGC028B] Removing Blocks SPOJ PE ...

  4. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)

    Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7669  Solved: 1894 [Sub ...

  5. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

    全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...

  6. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  7. SPOJ ATOMS - Atoms in the Lab

    题目链接:http://www.spoj.com/problems/ATOMS/ 题目大意:有N个原子,他们每秒分裂成K个新原子,新原子也能继续分裂.问如果要控制他的数量为M以内,应在什么时候使其停止 ...

  8. SPOJ 375. Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 375. Query on a tree Problem code: QTREE You are given a t ...

  9. SPOJ 694 Distinct Substrings(后缀数组)

    题目链接:http://www.spoj.com/problems/DISUBSTR/ 题意:给定一个串,求不同的字串的个数. 思路:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相 ...

  10. spoj Pattern Find(kmp)

    解法1 先计算模式串的前缀函数,然后通过前缀函数来搜索文本串 代码参考: https://github.com/wuli2496/OJ/blob/master/spoj/Pattern%20Find/ ...

最新文章

  1. 第02期 基础算法(Leetcode)刻意练习开营计划
  2. java桌游设计,java毕业设计_springboot框架的桌游吧管理
  3. python web 开发框架之Bottle
  4. html div中怎么引入另一个html文件
  5. 计算机怎么设置计算机组和用户,怎样设置同一工作组的计算机资源共享
  6. BERT论文阅读(二): CG-BERT:Conditional Text Generation with BERT for Generalized Few-shot Intent Detection
  7. 双11/618,除了能拉升业绩外,还有什么好处?
  8. Vim与clang-format
  9. Angular Component UI单元测试的隔离策略
  10. 一个java源文件允许_一个Java源文件中最多只能有一个class定义
  11. oracle批量update数据_东方国信大数据面试真题
  12. Matlab数据标准化
  13. SpringMVC视图解析器
  14. 【Python 必会技巧】使用 Python 追加写入 json 文件或更改 json 文件中的值
  15. VirtualBox无法启动虚拟机的解决办法
  16. 夜谈TCP/IP的起源和胜利
  17. NOI Linux 2.0版发布
  18. mysql解锁_mysql锁表如何解锁
  19. 数据挖掘课程第一章作业《认识数据挖掘与数据预处理》
  20. 自行车小组问卷调查报告

热门文章

  1. 大型网站软件架构特点
  2. Android——TextView属性XML详解
  3. Base64压缩UUID长度替换Hibernate原有UUID生成器
  4. windows2008下运行环境部署(iis,ftp,oracle)
  5. 分享:将XML(VS提取注释时生成)转换为Chm的一个方法
  6. vue控制台报错Duplicate keys detected: 'xxxxx'. This may cause an update error.解决方案
  7. vue 中使用echart5.2发生TypeError: Cannot read properties of undefined (reading ‘init‘)
  8. jQuery调用或获取iframe中的方法或控件值
  9. [C#] DBNull、Null和String.Empty的区别
  10. TCP新手误区–数据校验的意义