[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
4824: [Cqoi2017]老C的键盘
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 218 Solved: 171
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
共5个按键,第1个按键比第2个按键矮,第1个按键比第3个按键高,第2个按键比第4个
按键高,第2个按键比第5个按键矮。
这5个按键的高度排列可以是 2,4,1,3,5 , 3,4,1,2,5 , 3,4,2,1,5 。
HINT
Source
将原数列建成一颗二叉树。
对于一个节点i,f[i][j]表示节点在子树中排名为j的方案数。
转移的时候枚举每个子树中有多少个在它前面即可。
根据复杂度分析后可得时间复杂度为O(n^2)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
#define mod 1000000007
#define maxn 1001
using namespace std;
inline ll read() {
ll x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
struct data {int to,nxt,tp;}e[maxn*];
int head[maxn],cnt;
inline void add(int u,int v,int tp) {e[cnt].to=v;e[cnt].nxt=head[u];e[cnt].tp=tp;head[u]=cnt++;}
ll n,ans,jc[maxn],inv[maxn];
ll f[maxn][maxn],g[maxn][maxn],sz[maxn],t[maxn][maxn];
char s[maxn];
inline ll C(int x,int y){return jc[x]*inv[y]%mod*inv[x-y]%mod;}
void dp(int x) {
sz[x]=;f[x][]=;
if((x<<)<=n) add(x,x<<,s[x<<]=='>'?:);
if(((x<<)|)<=n) add(x,(x<<)|,s[(x<<)|]=='>'?:);
for(int i=head[x];i>=;i=e[i].nxt) {
int to=e[i].to;dp(to);
for(int j=sz[x];j>=;j--) {
for(int k=sz[to];k>=;k--) {
if(e[i].tp==) t[x][j+k]=(t[x][j+k]+f[to][k]*C(j+k-,k)%mod*C(sz[x]+sz[to]-j-k,sz[to]-k)%mod*f[x][j])%mod;
else t[x][j+k]=(t[x][j+k]+g[to][k+]*C(j+k-,k)%mod*C(sz[x]+sz[to]-j-k,sz[to]-k)%mod*f[x][j])%mod;
}
}
sz[x]+=sz[to];
for(int j=;j<=sz[x];j++) f[x][j]=t[x][j],t[x][j]=;
}
for(int i=sz[x];i>=;i--) g[x][i]=(g[x][i+]+f[x][i])%mod;
for(int i=;i<=sz[x];i++) f[x][i]=(f[x][i]+f[x][i-])%mod;
}
int main(){
memset(head,-,sizeof(head));
n=read();
scanf("%s",s+);
inv[]=inv[]=jc[]=jc[]=;
for(int i=;i<=n;i++) jc[i]=jc[i-]*i%mod,inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=n;i++) inv[i]=inv[i]*inv[i-]%mod;
dp();
printf("%lld\n",f[][sz[]]);
return ;
}
[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数的更多相关文章
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 193 Solved: 149[Submit][Statu ...
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...
- [bzoj4824][Cqoi2017]老C的键盘
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...
- BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】
题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...
- [CQOI2017]老C的键盘
[CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...
- [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...
- bzoj 4824: [Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...
- Luogu P3757 [CQOI2017]老C的键盘
题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...
- 洛谷 P3757 [CQOI2017]老C的键盘
题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...
随机推荐
- Linux环境下用Weblogic发布项目【一】 -- 安装Weblogic
一.Weblogic安装系统环境: 1.前提条件: a.在笔记本[Windows7]上安装远程连接Linux软件:F-Secure SSH File Transfer Trial[简写为:FSSH] ...
- im-switch -s ibus错误:Error: no configuration file "ibus" exists.
在虚拟机上安装Ubuntu14.04 后安装ibus输入法,万万没想到在切换输入法的时候居然出错了! 无语了,再网上查了一下,这个错误出现的还是比较少的. 先说Ubuntu输入法(ibus)安装的一般 ...
- [ssh]ssh系列之一
1.使用ssh建立sock代理 ssh -D 7070 -f -N user@host -D -f 后台执行 -N 不登陆shell执行
- zabbix调优PPT
http://www.slideshare.net/xsbr/alexei-vladishev-zabbixperformancetuning# http://zabbixzone.com/zabbi ...
- C#学习之泛型准备
想要把泛型搞明白,最好先弄明白下面的代码实例 本实例是建立了两个类,然后在类中可以添加任意类型的值,并且可以利用foreach语句读出 //第一个节点类,放在一个文件中 using System; u ...
- scrapy架构设计分析
scrapy是一个Python爬虫框架.我们自己用requests也能写爬虫(GET某个URL,然后Parse网页的内容),那么,问题来了,scrapy高明在哪些地方呢?下面就来讨论下这个话题,看看业 ...
- git merge与git rebase
文章源:https://blog.csdn.net/wh_19910525/article/details/7554489 git merge是用来合并两个分支的. git merge b # 将b分 ...
- 如何在阿里云服务器部署Django
这段时间一直在搞我的网站——大学易,一个大学生评课网站,主要是提供课程的详尽信息(比如老师会不会经常点名,有没有期中考试),课程资料的下载等等. 这篇文章主要是分享给那些菜鸟,就是像我一样完全没有搞过 ...
- hdu 4408 Minimum Spanning Tree
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 概率dp+期望dp 题目列表(一)
表示对概率和期望还不是很清楚定义. 目前暂时只知道概率正推,期望逆推,然后概率*某个数值=期望. 为什么期望是逆推的,例如你求到某一个点的概率我们可以求得,然后我们只要运用dp从1~n每次都加下去就好 ...