传送门

分析

我们通过仔细研究不难发现对于一次交换(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. java学习笔记--常用类

    一.Math类:针对数学运算进行操作的类 1.常用的方法 A:绝对值   public static int abs(int a) B:向上取整  public static double ceil( ...

  2. Python学习笔记一(基础信息)

    目录 输入输出 数据类型和变量 整数 浮点数 字符串 布尔值 空值 变量 常量 小结 欢迎关注我的博客我在马路边 说明:此笔记不是从零开始,在学习的过程中感觉需要记录一些比较重要和需要重复浏览的信息, ...

  3. storm 学习教程

    转自:http://blog.csdn.net/hrn1216/article/details/51538962 翻译太累了,再也不想去翻译了,真的太累了: 在这个教程中, 你将学到如何创建一个Sto ...

  4. I would I were a careless child

    I would I were a careless child by George Gordon Byron 1 I would I were a careless child, still dwel ...

  5. 异常[PersistenceUnit: default] Unable to build Hibernate SessionFactory

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManage ...

  6. systemd详解(CentOS 7)

    http://blog.51cto.com/xuding/1730952 一.init进程演变 1.init的发展 CentOS 5: SysV init,串行 CentOS 6:Upstart,并行 ...

  7. CS231n笔记列表

    课程基础1:Numpy Tutorial 课程基础2:Scipy Matplotlib 1.1 图像分类和Nearest Neighbor分类器 1.2 k-Nearest Neighbor分类器 1 ...

  8. 无法确定要使用哪一版本的 ASP.NET Web Pages。

    若要使用此站点,请在站点的 web.config 文件中指定一个版本.有关详细信息,请参阅 Microsoft 支持站点上的以下文章: http://go.microsoft.com/fwlink/? ...

  9. Hot resize Multipath Disk – Linux

    This post is for the users of the great dm-multipath system in Linux, who encounter a major availabi ...

  10. DCloud-MUI:杂项

    ylbtech-DCloud-MUI:杂项 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回 ...