洛谷P3757 [CQOI2017]老C的键盘
首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来
然后考虑树形dp,以大于为例
设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关)
我们考虑如果从当前子树中弄出$k$个节点,其他子树中弄出$j-1$个节点,那么当前节点的大小排名就是$k+j$
然后考虑一下,如果我们不看这个子树,根节点排在第$j$个,方案数是$f[i][j]$,如果只看此子树,此子树的根就是根节点的儿子,它在此子树中的排名可能是$1,2,...k$,那么我们就需要记录一下前缀和
然后考虑合并排列
对于小于根节点的,选出$j-1$个非此子树,对于大于根节点的,选出$sum[x]-1$个非此子树里弄出来的,那么就是一个组合问题了
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=,mod=1e9+;
int n,tot;char s[N];
ll f[N][N],g[N][N],tmp[N],c[N][N];
int head[N],ver[N<<],Next[N<<],sum[N];
inline void add(int u,int v){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
}
void dfs(int x){
int l=x<<,r=l|;;
if(l<=n) add(x,l);
if(r<=n) add(x,r);
g[x][]=f[x][]=sum[x]=;
for(int i=head[x];i;i=Next[i]){
int v=ver[i];dfs(v);
memset(tmp,,sizeof(tmp));
for(int j=;j<=sum[x];++j)
for(int k=;k<=sum[v];++k){
if(s[v]=='>')
tmp[j+k]+=f[x][j]*g[v][k]%mod
*c[j+k-][j-]%mod*c[sum[x]+sum[v]-j-k][sum[x]-j]%mod;
else tmp[j+k]+=f[x][j]*(g[v][sum[v]]-g[v][k]+mod)%mod
*c[j+k-][j-]%mod*c[sum[x]+sum[v]-j-k][sum[x]-j]%mod;
}
sum[x]+=sum[v];
for(int j=;j<=sum[x];++j)
f[x][j]=tmp[j]%mod,g[x][j]=(g[x][j-]+f[x][j])%mod;
}
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%s",&n,s+);
c[][]=;
for(int i=;i<=n;++i){
c[i][]=;
for(int j=;j<=i;++j)
c[i][j]=(c[i-][j]+c[i-][j-])%mod;
}
dfs();printf("%lld\n",g[][sum[]]);
return ;
}
洛谷P3757 [CQOI2017]老C的键盘的更多相关文章
- [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...
- 洛谷 P3757 [CQOI2017]老C的键盘
题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...
- Luogu P3757 [CQOI2017]老C的键盘
题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...
- [bzoj4823][洛谷P3756][Cqoi2017]老C的方块
Description 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上 ,如果两个小方格有公共的边,就称它们是相邻的, ...
- 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流
正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...
- [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 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...
随机推荐
- testng ITestListener使用
ITestListener适用场景 当使用testng执行测试时,我们常会想在某个阶段做一些特别的处理,比如:测试成功结束后,测试失败后,跳过某个脚本后,全部脚本执行完毕后.要想达成这个目标,我们需要 ...
- Android Weekly Notes Issue #275
Android Weekly Issue #275 September 17, 2017 Android Weekly Issue #275 本期内容包括给Google Map实现一个Marker A ...
- android 电池(一):锂电池基本原理篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/8497830 关键词:Android 电池关机充电 androidboot.mode ...
- UEditor上传文件的默认地址修改
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text.Re ...
- Too many open files解决方案及原理
以下是我解决Too many open files异常时学习的知识的理解和总结,如有不正确指出,敬请指出! 此问题中文搜索雷同,你可以尝试以下关键字:"file descriptor lea ...
- Contiki Etimer 模块
一.Etimer概述 Etimer提供产生时间事件(timed event)的机制,当设定好的timer到期时,将会给设定etimer的process发送一个PROCESS_EVENT_TIMER 事 ...
- 使用jedisPool管理jedis,使用jedis操作redis
ps:jedis是redis在java中的客户端操作工具 package com.test; 2 3 import java.util.HashMap; 4 import java.util.Iter ...
- 从CWnd::GetSafeHwnd实现得到的知识
在看MFC源码的过程中,有个地方一直不解,看如下代码 BOOL CFrameWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWO ...
- Linux下的Tomcat JVM 调优
1. 适用场景 Tomcat 运行过程遇到Caused by: java.lang.OutOfMemoryError: PermGen space或者java.lang.OutOfMemoryErro ...
- 【Lintcode】 035.Reverse Linked List
题目: Reverse a linked list. Example For linked list 1->2->3, the reversed linked list is 3-> ...