题面

luogu

题解

其实就是一颗二叉树

我们假设左儿子小于根,右儿子大于根

考虑树形\(dp\)

\(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小

那么考虑子树合并

其实就是两个序列的合并

如果是左子树

枚举\(j\)为子树内有多少个数小于其根

那么以\(i\)为根的子树一定至少有\(j\)个

那么我们换一下枚举的东西

改成枚举有多少个数小于\(u\)

剩下的问题就是分配权值的问题了

组合数计算一下(具体看代码注释)

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 110, Mod = 1e9 + 7;
int f[N][N], g[N][N], tmp[N], n, siz[N], C[N][N];
char s[N];
struct node {
int to, nxt;
}G[N];
int last[N], gl;
void add(int x, int y) {
G[++gl] = (node) {y, last[x]};
last[x] = gl;
}
void pls(int &x, int y) {
x += y;
if (x >= Mod) x -= Mod;
}
void dfs(int u) {
int ls = u << 1, rs = u << 1 | 1;
if (ls <= n) add(u, ls);
if (rs <= n) add(u, rs);
g[u][1] = f[u][1] = siz[u] = 1;
for (int z = last[u]; z; z = G[z].nxt) {
int v = G[z].to;
dfs(v);
for (int i = 1; i <= siz[u] + siz[v]; i++) tmp[i] = 0;
for (int i = 1; i <= siz[u]; i++)
for (int j = 0; j < siz[v]; j++)//子树v有j个数小于u(不包括v)
if (s[v] == '>')
pls(tmp[i + j + 1], 1ll * f[u][i] * g[v][j + 1] % Mod
* C[i + j][i - 1] % Mod * C[siz[u] + siz[v] - i - j - 1][siz[u] - i] % Mod);//一共有i+j数小于u,分配给i-1个位置权值 , siz[u] + siz[v] - i - j - 1个数大于u
else
pls(tmp[i + j], 1ll * f[u][i] * (g[v][siz[v]] - g[v][j] + Mod) % Mod
* C[i + j - 1][i - 1] % Mod * C[siz[u] + siz[v] - i - j][siz[u] - i] % Mod);
siz[u] += siz[v];
for (int i = 1; i <= siz[u]; i++) f[u][i] = tmp[i], g[u][i] = (g[u][i - 1] + f[u][i]) % Mod;
}
return ;
} int main() {
scanf("%d%s", &n, s + 2);
for (int i = 0; i <= n; i++) C[i][i] = C[i][0] = 1;
for (int i = 2; i <= n; i++)
for (int j = 0; j < i; j++)
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % Mod;
dfs(1);
printf("%d\n", g[1][n]);
return 0;
}

洛谷 P3757 [CQOI2017]老C的键盘的更多相关文章

  1. [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

    Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...

  2. 洛谷P3757 [CQOI2017]老C的键盘

    传送门 首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小 ...

  3. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  4. [bzoj4823][洛谷P3756][Cqoi2017]老C的方块

    Description 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上 ,如果两个小方格有公共的边,就称它们是相邻的, ...

  5. 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...

  6. [CQOI2017]老C的键盘

    [CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...

  7. [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 218  Solved: 171[Submit][Statu ...

  8. [BZOJ4824][CQOI2017]老C的键盘(树形DP)

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 193  Solved: 149[Submit][Statu ...

  9. bzoj 4824: [Cqoi2017]老C的键盘

    Description 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...

随机推荐

  1. 如何求数字n的因数个数及因数和

    我们有可能在某些数学题中会求到某个数的因数和,那我们怎么求呢? 因为我们知道任意一个合数都可以由两个或多个质数相乘得到,那么我们就先分解质因数吧 例:我们随便去一个数吧,嗯,就108了,好算... 我 ...

  2. hrabs 首页 新闻,快捷菜单,响应式列表,seliverlight

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="firstPage.aspx ...

  3. centos环境下登录mysql报 ERROR 1045 (28000)怎么解决

    centos环境下登录mysql报 ERROR 1045 (28000)怎么解决 新入手一台虚拟机,Centos7系列的操作系统,安装mysql后,执行连接出现了Mysql ERROR 1045 (2 ...

  4. mongo find

    MongoVUE 对应成语句,结构如下: db.logs.find({ "message" : /消息/ }, { "message" : 1 }).limit ...

  5. win7更改路由器wifi 密码

    1.有线.无线都能进入192.168.1.1路由设置界面 (也可能是192.168.0.1看路由底面IP) ps: 无线(笔记本与路由没使用网线相连)情况下必须开启wifi连接上该路由才能进入. 无法 ...

  6. canvas里调用getImageData的报security的问题

    canvas元素支持绘制任意图片元素: var ctx = document.getElementById("canvas").getContext("2d") ...

  7. 用Swift实现一款天气预报APP(一)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) Swift作为现在苹果极力推广的语言,发展的非常快.这个 ...

  8. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  9. 企业搜索引擎开发之连接器connector(二十一)

    从上文中的QueryTraverser对象的BatchResult runBatch(BatchSize batchSize)方法上溯到CancelableBatch类,该类实现了TimedCance ...

  10. An error "Host key verification failed" when you connect to other computer by OSX SSH

    Here's quick way to remove all entries in the host file: In an OSX terminal, type rm -f ~/.ssh/known ...