Luogu P3757 [CQOI2017]老C的键盘
题目描述
老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的键盘的更多相关文章
- [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...
- 洛谷 P3757 [CQOI2017]老C的键盘
题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...
- 洛谷P3757 [CQOI2017]老C的键盘
传送门 首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小 ...
- [CQOI2017]老C的键盘
[CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...
- [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 218 Solved: 171[Submit][Statu ...
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 193 Solved: 149[Submit][Statu ...
- bzoj 4824: [Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...
- [bzoj4824][Cqoi2017]老C的键盘
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...
- BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)
前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...
随机推荐
- Django-发送注册、忘记密码邮件验证-send_mail
用户邮箱注册.发送验证码流程图 那,如何解决? 1. setting配置邮箱参数 # 邮箱设置,需要在邮箱中开启smtp服务 # 提供服务的主机域名 EMAIL_HOST = 'smtp.163.c ...
- FastReport.Mono添加了新的条形码ITF-14
FastReport.Mono 是一款为Mono Framework设计的功能全面的报表生成工具.FastReport.Mono 是一个多平台的报表解决方法.它可以应用于Windows, Linux, ...
- mysql-7-join
#进阶7:连接查询 /* 多表连接:查询的字段来自多个表 按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接 */ USE girls; SELEC ...
- 什么是ICD文件
ICD就是IED Capability Description的简称,中文为IED能力描述文件.其中 IED是Intelligent Electronic Device的简称,是智能电子设备 智能电子 ...
- 用于编写下一代JavaScript的编译器。
下载 用于编写下一代JavaScript的编译器. 支持巴别塔 Babel(发音为babble)是一个由社区驱动的项目,被许多公司和项目使用,由一群志愿者维护.如果你愿意帮助支持这个项目的未来,请考虑 ...
- 第1天 | 12天搞定Python,告诉你有什么用?
掌握多一门编程语言,多一种选择,多一份机遇,更何况学的是人见人爱,花见花开的Python语言.它目前可占据编程语言排行榜的第3名,是名副其实的"探花郎",无论用它做什么(网络爬虫. ...
- 【Office-Word妙手回春】Word文本秒转表格
第一步:Ctrl+A组合键,文本全选 第二步:插入→表格→文本转换成表格 第三步:在"文字分隔位置",勾选相应的符号. 此处的分隔符为 空格. 点击"确定"按钮 ...
- install Wine + WeChat in Fedora 31
install Wine + WeChat in Fedora 31 dnf -y install dnf-plugins-core dnf config-manager --add-repo htt ...
- 多测师讲解selenium _滚动条定位_高级讲师肖sir
from selenium import webdriverfrom time import sleepdrvier=webdriver.Chrome()drvier.get('http://www. ...
- 微信聊天记录导出为csv,并生成词云图
微信聊天记录生成特定图片图云 首先贴上github地址 https://github.com/ghdefe/WechatRecordToWordCloud 来个效果图 提取聊天记录到csv参考教程 h ...