题意:

有 \(n\) 列表格,第 \(i\) 列有 \(a_i\) 个格子,问在 \(n\) 列表格中有多少种放置 \(k\) 个棋子的方法使没有棋子在同一列和同一行。(如果中间有一个“格子”是空的,那么不算在同一行)

思路很妙。

如果所有 \(a_i\) 都相等(一个矩形),答案明显是 \(\binom {a_i} k \times \binom n k \times k!\)。

我们发现这个问题棘手的地方在于不能在同一行,所以考虑将答案分为两部分:

  1. 去掉最下面的矩形后,剩下两块不规则图形的答案
  2. 最下面的矩形

然后我们发现不会做。。。

你不会做的题很可能是DP。

考虑 DP,设 \(dp[u][k]\)表示以 \(u\) 为分治中心时,放置 \(k\) 个棋子的方案数。

对于两块不规则图形的答案,合并这一部分的答案类似一个背包 DP。

最下面的矩形明显可以直接计算其答案。

于是我们就做完了。。。

对于找最小值,我们发现只需要对序列建笛卡尔树就能很方便地找到最小值。ST表也可以,只不过是 \(O(n\log n)\) 的。

复杂度为 \(O(n^2k)\)

#include<cstdio>
typedef long long ll;
const int M=505,mod=1e9+7;
int n,k,a[M],L[M],R[M],siz[M],dp[M][M];
int fac[1000005],ifac[1000005];
int top,stk[M];
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline void init(const int&M){
register int i;fac[0]=fac[1]=ifac[0]=ifac[1]=1;
for(i=2;i<=M;++i){
fac[i]=1ll*fac[i-1]*i%mod;
ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod;
}
for(i=2;i<=M;++i)ifac[i]=1ll*ifac[i]*ifac[i-1]%mod;
}
inline int C(const int&n,const int&m){
return m>n?0:1ll*ifac[m]*ifac[n-m]%mod*fac[n]%mod;
}
void DFS(int u,int f){
if(!u)return;
register int i,j,tmp;
DFS(L[u],u);DFS(R[u],u);siz[u]=siz[L[u]]+siz[R[u]]+1;
for(i=0;i<=siz[L[u]];++i){
for(j=0;j<=siz[R[u]];++j){
dp[u][i+j]=Add(dp[u][i+j],1ll*dp[L[u]][i]*dp[R[u]][j]%mod);
}
}
for(i=siz[u];i>=0;--i){
tmp=0;
for(j=0;j<=i;++j){
tmp=Add(tmp,1ll*dp[u][j]*fac[i-j]%mod*C(a[u]-a[f],i-j)%mod*C(siz[u]-j,i-j)%mod);
}
dp[u][i]=tmp;
}
}
signed main(){
register int i;
scanf("%d%d",&n,&k);dp[0][0]=1;init(1e6);
for(i=1;i<=n;++i)scanf("%d",a+i);
for(i=1;i<=n;++i){
if(top&&a[i]<=a[stk[top]]){
while(top&&a[i]<=a[stk[top]])R[stk[top-1]]=stk[top],--top;
L[i]=stk[top+1];
}
stk[++top]=i;
}
while(top)R[stk[top-1]]=stk[top],--top;
DFS(stk[1],0);
printf("%d",dp[stk[1]][k]);
}

SP3734题解的更多相关文章

  1. 题解 SP3734 【PERIODNI - Periodni】

    考虑用\(DP\)和组合数学来解决. 因为原图像不规则的形状不好处理,所以先用笛卡尔树(性质为小根堆)将其划分成一个一个的矩形. 发现在笛卡尔树上的每个节点都对应一个矩形,矩形高为\(h_x-h_{f ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. Java线程--CopyOnWrite容器使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871602.html Java线程--CopyOnWrite容器使用 CopyOnWrit容 ...

  2. activiti5.13 框架 数据库表结构说明

    1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: 'RE'表示repository(存储),RepositoryService接口所操作的 ...

  3. 微服务技术栈简单介绍,Eureka和Ribbon的引入和使用

    一.了解微服务架构 1.微服务技术栈 整体框架 整体学习规划路线2.微服务与单体架构的区别 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优势 结构简单 部署成本低 缺点 耦合度高, ...

  4. Docker名词解释

    http://www.runoob.com/docker/docker-architecture.html  

  5. vc++调试总结

    .在debug->windows下,有以下调试窗口 1)Breakpoints管理断点信息 可以新建条件断点,函数断点,以及特定地址改变断点(用于检测数据发生改变时机点) 在断点处,可以进入汇编 ...

  6. VSCode官方的配置同步方案

    前言 这几天在迁移电脑工作环境,对于VSCode,我实在不想从头做下载插件.配置代码规则这样的事情,于是求助百度,搜索结果靠前的解决方案基本都是使用Setings Sync插件,于是我就从了. 经过好 ...

  7. 2022年了有哪些值得推荐的.NET ORM框架?

    前言: 最近有很多同学问我.NET方面有哪些好用的ORM框架,我觉得这方面的介绍网上应该会介绍的比较全面文章,于是我想搜一篇全面的介绍文章发给他们结果我发现网上说来说去基本上就是那几个,于是就有了这篇 ...

  8. python-利用xlrd模块中读取有合并单元格的excel数据

    前言 对于excel中有合并单元格的情况,合并的单元格只能取到第一个单元格的值,合并的单元格后面的单元格内容的值为空,针对这个情况,写了下面一段代码实现, 对单元格进行判断,如果是传入的索引是合并单元 ...

  9. FastDFS安装和简介详细总结

    1.fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统. 2 FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, 3 ...

  10. Typora的使用教程.md

    Typora的使用教程 原创:https://home.cnblogs.com/u/cn-zhouchao 2021.12.13 一.软件的介绍 Typora 是一款由 Abner Lee 开发的轻量 ...