题目描述

老C的键盘

题解

显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数

根据这一特性想到了啥??? 感谢leo101的友情点拨

二叉树!!!

所以可以把 x/2 看做是 x的父亲, 1 显然就是根

可以把 < 看作是由父亲连向儿子的有向边, > 看作是儿子连向父亲的有向边

所以就是求这棵树的拓扑序的方案数就好了!!!

考虑当前节点的两棵子树都已处理完的时候

在满足和 当前节点的关系的同时, 两颗子树在拓扑序中出现的顺序显然是没有影响的,所以按照子树大小组合数乱搞就好了

然后设 dp[i][j] 表示 i 号节点在当前子树排在第 j 位的方案数就好了

代码


#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define in inline
#define get getchar()
in int read()
{
int t=0; char ch=get;
while (ch<'0' || ch>'9') ch=get;
while (ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
return t;
}
const int mod=1e9+7;
const int _=1010;
ll n,dp[_][_],c[_][_],siz[_]; //siz[i]是以i为根的子树节点个数, c[][]是组合数
char s[_];
in void dfs(ll x)
{
for(re int to=2*x;to<=min(n,2*x+1);to++)
{
dfs(to);
if(s[to]=='>')
{
for(re ll k=siz[x]+siz[to]; k>=1; k--)
{
ll sum=0;
for( re int i=1; i<=min(siz[x],k); i++)
{
for (re int j=k-i+1;j<=siz[to];j++)
{
ll a=(dp[x][i]*dp[to][j])%mod;
ll b=(c[i-1][k-1]*c[siz[x]-i][siz[x]+siz[to]-k])%mod;
a=(a*b)%mod;
sum=(sum+a)%mod;
}
}
dp[x][k]=sum;
}
}
else
{
for(re ll k=siz[x]+siz[to]; k>=1; k--)
{
ll sum=0;
for(re int i=1; i<=min(siz[x],k); i++)
for(re int j=1; j<=min(k-i,siz[to]); j++)
{
ll a=(dp[x][i]*dp[to][j])%mod;
ll b=(c[i-1][k-1]*c[siz[x]-i][siz[x]+siz[to]-k])%mod;
a=(a*b)%mod;
sum=(sum+a)%mod;
}
dp[x][k]=sum;
}
}
siz[x]+=siz[to]; //子树大小统计
}
}
int main()
{
n=read();
scanf("%s",s+2);
c[0][0]=1;
for (re int i=1; i<=n; i++)
{
c[0][i]=1,c[i][i]=1;
dp[i][1]=1,siz[i]=1;
for (re int j=1; j<i; j++) c[j][i]=(c[j][i-1]+c[j-1][i-1])%mod;
} //预处理组合数
dfs(1);
ll ans=0;
for (re int i=1; i<=n; i++) ans=(ans+dp[1][i])%mod; //因为一号节点是整棵树的根
cout<<ans<<endl;
return 0;
}

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

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

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

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

    题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...

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

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

  4. [CQOI2017]老C的键盘

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

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

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

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

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

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

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

  8. [bzoj4824][Cqoi2017]老C的键盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...

  9. BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)

    前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...

随机推荐

  1. Django-发送注册、忘记密码邮件验证-send_mail

    用户邮箱注册.发送验证码流程图 那,如何解决? 1.  setting配置邮箱参数 # 邮箱设置,需要在邮箱中开启smtp服务 # 提供服务的主机域名 EMAIL_HOST = 'smtp.163.c ...

  2. FastReport.Mono添加了新的条形码ITF-14

    FastReport.Mono 是一款为Mono Framework设计的功能全面的报表生成工具.FastReport.Mono 是一个多平台的报表解决方法.它可以应用于Windows, Linux, ...

  3. mysql-7-join

    #进阶7:连接查询 /* 多表连接:查询的字段来自多个表 按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接 */ USE girls; SELEC ...

  4. 什么是ICD文件

    ICD就是IED Capability Description的简称,中文为IED能力描述文件.其中 IED是Intelligent Electronic Device的简称,是智能电子设备 智能电子 ...

  5. 用于编写下一代JavaScript的编译器。

    下载 用于编写下一代JavaScript的编译器. 支持巴别塔 Babel(发音为babble)是一个由社区驱动的项目,被许多公司和项目使用,由一群志愿者维护.如果你愿意帮助支持这个项目的未来,请考虑 ...

  6. 第1天 | 12天搞定Python,告诉你有什么用?

    掌握多一门编程语言,多一种选择,多一份机遇,更何况学的是人见人爱,花见花开的Python语言.它目前可占据编程语言排行榜的第3名,是名副其实的"探花郎",无论用它做什么(网络爬虫. ...

  7. 【Office-Word妙手回春】Word文本秒转表格

    第一步:Ctrl+A组合键,文本全选 第二步:插入→表格→文本转换成表格 第三步:在"文字分隔位置",勾选相应的符号. 此处的分隔符为 空格. 点击"确定"按钮 ...

  8. install Wine + WeChat in Fedora 31

    install Wine + WeChat in Fedora 31 dnf -y install dnf-plugins-core dnf config-manager --add-repo htt ...

  9. 多测师讲解selenium _滚动条定位_高级讲师肖sir

    from selenium import webdriverfrom time import sleepdrvier=webdriver.Chrome()drvier.get('http://www. ...

  10. 微信聊天记录导出为csv,并生成词云图

    微信聊天记录生成特定图片图云 首先贴上github地址 https://github.com/ghdefe/WechatRecordToWordCloud 来个效果图 提取聊天记录到csv参考教程 h ...