[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\)小 那么考虑子树合并 其 ...
随机推荐
- Codeforces Round #514 (Div. 2) C. Sequence Transformation(递归)
C. Sequence Transformation 题目链接:https://codeforces.com/contest/1059/problem/C 题意: 现在有1~n共n个数,然后执行下面操 ...
- UVA10600:ACM Contest and Blackout(次小生成树)
ACM Contest and Blackout 题目链接:https://vjudge.net/problem/UVA-10600 Description: In order to prepare ...
- JQuery学习一
第一个JQuery程序 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...
- Spring 源码学习(1) —— 自定义标签
Spring 工作流程是先加载解析xml配置文件:配置文件中存在默认的标签,也可以自定义标签.解析默认标签调用: private void parseDefaultElement(Element el ...
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 【BZOJ】1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
[题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点未被删除且不能到达结点1,求最少的删除点个数. [算法]最小割 [题解]本题和1的区别是:1求的是最少的不能到达1的结点数,那么就把损 ...
- apache log 按日期记录 格式 <GOOD>-- (转)
在apache的配置文件中找到ErrorLog logs/error_logCustomLog logs/access_log common Linux系统配置方法: 将其改为ErrorLog “| ...
- python碎片记录(二)
1.字典中嵌套字典使用 dict={'a':{1:2,2:3}} print(dict) print(dict['a'][2]) 输出如下: {'a': {1: 2, 2: 3}} 3 2.元组与l ...
- [Leetcode Week16]Insertion Sort List
Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...