传送门

分析

我们通过仔细研究不难发现对于一次交换(i,i+1)的操作之后,在i之前的点就不可能跑到i之后,i+1之后的的点也不可能跑到i+1之前,所以这个序列在一次交换之后就相当于被分成了两个部分。于是我们设dp[n][low]表示对于一个长度为n的最小值为low的序列的构成方案数。于是我们可以求出dp[n][low]=dp[i][low]*dp[n-i][low+i]*C(n-2,n-i-1)(i∈(1,n)且此情况合法)。C(n-2,n-i-1)表示在交换这一次之前共要进行n-2次交换,其中n-i-1次是在左边交换,因为选的左右顺序不同是不同的方案,所以要乘上这个值。而至于判断i是否合法见代码。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const long long mod = 1e9+;
long long p[],dp[][],N,c[][];
inline void getc(){
long long i,j,k;
for(i=;i<=;i++)c[i][]=c[i][i]=;
for(i=;i<=;i++)
for(j=;j<i;j++)
c[i][j]=(c[i-][j]+c[i-][j-])%mod;
}
inline long long go(long long n,long long low){
if(dp[n][low]!=-)return dp[n][low];
if(n==)return dp[n][low]=;
long long i,j,k,cnt=,now[];
for(i=;i<=N;i++)if(p[i]>=low&&p[i]<low+n)now[++cnt]=p[i];
dp[n][low]=;
for(i=;i<n;i++){
bool ok=;
swap(now[i],now[i+]);
for(j=;j<=i;j++)if(now[j]>=low+i){ok=;break;}
if(ok){
dp[n][low]=(dp[n][low]+
go(i,low)*go(n-i,low+i)%mod*c[n-][i-]%mod)%mod;
}
swap(now[i],now[i+]);
}
return dp[n][low];
}
int main(){
long long i,j,k;
memset(dp,-,sizeof(dp));
scanf("%lld",&N);getc();
for(i=;i<=N;i++)scanf("%lld",&p[i]);
printf("%lld\n",go(N,));
return ;
}

ZROI2018普转提day2t1的更多相关文章

  1. ZROI2018普转提day6t1

    传送门 分析 记录区间最大值,线段树上二分找比这个点大的最靠前位置即可 代码 #include<iostream> #include<cstdio> #include<c ...

  2. ZROI2018普转提day6t3

    传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...

  3. ZROI2018普转提day7t1

    传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...

  4. ZROI2018普转提day7t2

    传送门 分析 首先我们不难想到我们一定可以将每一个点分开算,然后看这个点被几个矩形包含 于是对于位置为$(i,j)$的点它被包含的次数为$i * (n-i+1) * j * (m-j+1)$ 这个式子 ...

  5. ZROI2018普转提day1t4

    传送门 分析 就是飞飞侠这道题...... 我们可以将这张图建成好几层,每一层可以向下一层的上下左右无代价移动,而对于每个点如果付b[i][j]的代价就可以走到比它高a[i][j]的层上.我们用这种方 ...

  6. ZROI2018普转提day1t1

    传送门 分析 我们先二分一下最终的平均值mid,然后让序列中的每一个数都减去这个mid,之后用新序列的前缀和建一棵线段树,枚举起点i,然后求出此时在i+L-1~i+R-1范围内的前缀和的最大值,用这个 ...

  7. ZROI2018普转提day2t4

    传送门 分析 考场上暴力水过好评... 然后我的st表查询似乎是log的,然后log三方跑的比log方快,qwq. 我们发现如果一个区间的最小值就是这个区间的gcd,则这个区间合法.所以我们二分区间长 ...

  8. ZROI2018普转提day2t2

    传送门 分析 我们发现2R+C实际就相当于R行C列的子集的个数.因此我们可以将所有集合的子集个数转换为每个集合属于的集合的个数.所以我们可以求出: 这个式子的意义为对于选i行j列的情况的所有方案乘上i ...

  9. ZROI2018普转提day2t3

    传送门 分析 考试的时候sb了......我们发现可以按照先序遍历将一棵树变成一个序列,而不需要删的数的数量便是最长上升子序列的长度,但是还有一个问题就是如果在5和7之间有3个空的位置就无法填入合法的 ...

随机推荐

  1. 条款51:编写new以及delete的时候需要固守常规

    C++中delete一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变.你需要手工将其赋值为NULL.注意的一点是delete NULL指针的时候不会有任何的事情发生   小结:     o ...

  2. PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID

    向mysql 插入数据时,很多时候我们想知道刚刚插入数据的id,这对我们很有用.下面这篇文章就详细给大家介绍了利用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID,有需要的朋友 ...

  3. BEC listen and translation exercise 6

    能听懂自己的录音,说明发音还行,可惜听不懂... Another problem is that the members of the Biramichi fishing cooperative ar ...

  4. MySQL主从复制的常用拓扑结构

    1.复制的常用拓扑结构 复制的体系结构有以下一些基本原则: (1)    每个slave只能有一个master: (2)    每个slave只能有一个唯一的服务器ID: (3)    每个maste ...

  5. go语言redis使用(redigo)

    通过一个例子来学习redigo的使用,其中主要使用到了redis的订阅与发布功能,以及redis连接池的实现 redis操作: // tcp连接redis rs, err := redis.Dial( ...

  6. GO语言list剖析

    GO语言list剖析 本节内容 使用方法 list提供的方法 源码剖析 1. 使用方法 在GO语言的标准库中,提供了一个container包,这个包中提供了三种数据类型,就是heap,list和rin ...

  7. 关于postman、postman interceptor的安装、配置问题

    由于app中有一些鉴权问题,需要携带浏览器的cookie. 不然的话不能够正确测试接口,就在chrome(这里下载的来源是Google商店)中添加了postman interceptor插件. 然后发 ...

  8. Azure SLB + httpd + ILB + HAProxy + Atlas + MySQL

    为了测试一个环境,需要在Azure上搭建高可用的LAMP架构.但要求MySQL的中间件Atlas采用主备的模式.在数据中心一般采用Keepalive+VIP的模式,通过浮动地址对外提供服务. 但在云环 ...

  9. HDU2841(容斥原理)

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  10. linux指令 apt-grt指令使用

    apt-get 是linux的一条指令,主流的linux版本Debian和ubuntu都使用apt-get来安装软件.那么,需安装的软件都放在哪里呢??? apt-get 利用软件安装源来安装软件,其 ...