题目描述

有一个长度为 n n n的序列 a a a,现在对数列进行一些变换,每次可以选择一对 i , j i,j i,j,满足 1 ≤ i < j ≤ n 1\leq i < j\leq n 1≤i<j≤n且 a i > a j a_i>a_j ai​>aj​,然后将 a i a_i ai​和 a j a_j aj​交换。如果序列 b b b可以由序列 a a a经过若干次变换得到,那么称 b b b是可达的。求有多少种不同的可达的序列,输出答案模 1000000007 1000000007 1000000007。

输入格式

第一行一个数 n n n,接下来一行 n n n个数,分别为 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1​,a2​,…,an​,保证这是 n n n的一个排列。

输出格式

输出一个整数,表示答案对 1000000007 1000000007 1000000007取模后的值。

样例输入

4
2 4 1 3

样例输出

8

样例解释

可达的排列有 2413, 2314, 2143, 2134, 1423, 1243, 1324, 1234。

数据范围

对于 20 % 20\% 20%的数据, 1 ≤ n ≤ 10 1\leq n\leq 10 1≤n≤10
对于 40 % 40\% 40%的数据, 1 ≤ n ≤ 15 1\leq n\leq 15 1≤n≤15
对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 20 1\leq n\leq 20 1≤n≤20

题解

我们来考虑一下序列可达的条件是什么。

如果这不是 n n n的排列,而是 01 01 01序列的话,那么条件很显然:对于任意的 i i i,序列 b b b从右往左的第 i i i个 1 1 1都位于序列 a a a从右往左的第 i i i个 1 1 1的右边(不一定严格,可以在同一个位置),那么 a a a就可以到达 b b b。

对于一个排列 a a a以及一个数 k k k,把 a a a中大于等于 k k k的数标为 1 1 1,剩下的数标为 0 0 0,那么就能得到一个 01 01 01序列。如果对于任意的 k k k,排列 a a a对应的 01 01 01序列都能够到达排列 b b b,那么排列 a a a就能到达排列 b b b。

如果排列 b b b不满足条件,那么排列 a a a一定不能到达排列 b b b。但为什么只要排列 b b b满足条件,排列 a a a就一定能够到达排列 b b b呢?

我们可以让 i i i从 1 1 1到 n n n,每次将数字 i i i移到目标位置,令当前位置为 l l l,目标位置为 r r r,当前 ( l , r ] (l,r] (l,r]区间的最大数字为 a j a_j aj​,则让 a l a_l al​和 a j a_j aj​交换即可。

那要怎么实现呢?

设 f i , j f_{i,j} fi,j​表示当前从大到小放到第 i i i个数字,且按大于等于 i i i为 1 1 1,小于 i i i为 0 0 0来构成的 01 01 01串为 j j j,此时的方案数。要保证在枚举过程中 01 01 01串要满足上面的条件。一开始是全 0 0 0的 01 01 01串,答案是全 1 1 1的 01 01 01串。

时间复杂度为 O ( n ⋅ 2 n ) O(n \cdot 2^n) O(n⋅2n)。

code

#include<bits/stdc++.h>
using namespace std;
int n,tot=0,a[25],d[2000005],l[2000005],r[2000005];
long long f[25][1<<20];
long long mod=1000000007;
void add(int xx,int yy){l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;
}
int gt(int s){int re=0;while(s){re+=s&1;s>>=1;}return re;
}
bool pd(int s,int t){int w=0;for(int i=n;i>=1;i--){if(t&(1<<i-1)) ++w;if(a[i]>=s) --w;if(w<0) return 0; }return 1;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int s=0;s<(1<<n);s++){add(gt(s),s);}f[n+1][0]=1;for(int s=n;s>=1;s--){for(int i=r[n-s+1];i;i=l[i]){if(!pd(s,d[i])) continue;for(int j=1;j<=n;j++){if(d[i]&(1<<j-1)){f[s][d[i]]=(f[s][d[i]]+f[s+1][d[i]^(1<<j-1)])%mod;}}}}printf("%lld",f[1][(1<<n)-1]);return 0;
}

绍兴一中信心赛 T1排列相关推荐

  1. 2018.7.17 绍兴一中模拟赛 解题报告

    成绩: 100+100+50=250(考得不错,只可惜跑得太慢,是250中最慢的一个) T1:交换(swap) 满分解法1: 这题是真的水. 先介绍一个比较麻烦的做法,也是我考试时的做法. 大致思路就 ...

  2. 绍兴一中模拟赛3.19——时光流转

    Description Solution 离线以后点分 对于每个点,都用这个点的祖先把这个点的子树更新一遍, 考虑到操作时间早的才能更新晚的和题目中说的"路径上边权都大于等于 v a l v ...

  3. fzyczn生日赛t1 CZN

    fzy&czn生日赛t1 CZN 膜拜hybb首杀 文章目录 fzy&czn生日赛t1 CZN 题目背景 题目描述 分析 my code wnag's code 题目 题目背景 有一天 ...

  4. 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码

    洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...

  5. 程序设计天梯赛——T1(15分)java版

    程序设计天梯赛--java版 文章目录 程序设计天梯赛--java版 3-个位数统计 输入格式: 输出格式: 输入样例: 输出样例: 5-考试座位号 输入格式: 输出格式: 输入样例: 输出样例: 1 ...

  6. 纪中20日c组模拟赛T1 2121. 简单游戏

    T1 2121. 简单游戏 (File IO): input:easy.in output:easy.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto Pro ...

  7. 【多题合集】【loliの模拟赛】排列组合大套餐

    有兴趣的同学可以去下数据包自己做一下 ------------------------------------------------------ 1. 输入一行字母(长度小于等于10),输出:第一行 ...

  8. 世纪末的星期(Java-蓝桥杯-省赛-T1)初学者详解

    T1 世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破.还有人称今后的某个世纪末的12月31日,如果是星期一则会....有趣的是,任何一个世纪末的年份的12月31日都不 ...

  9. 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)

    找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...

最新文章

  1. 一通骚操作,我把SQL执行效率提高了10000000倍!
  2. 通过init.rc中的property实现动态控制service的开启与关闭
  3. Python 封装MySQL类
  4. 你写的前端到底用没用到这些
  5. matlab概率及数理统计学习-T检验、卡方检验、直方图分布检验
  6. tlc5620输出三角波流程图_TLC5620(电压输出型)_pdf
  7. 【ROS学习笔记】(十二)常用可视化工具
  8. C#不区分大小写的字符串替换(Replace)
  9. 维护 linux 服务器常用操作命令
  10. linux命令(47):Linux下对文件进行按行排序,去除重复行
  11. 极路由2hc5761刷华硕固件_[固件] 【原创首发】极二路由HC5761 9012.1.9227s成功刷成openwrt...
  12. 300多张精美京剧脸谱,收藏~~
  13. Linux Get命令
  14. 【经典】双子男与天蝎女的爱情故事
  15. jzoj3395 Freda的传呼机
  16. 数据结构课设—图型结构题目—行车路线
  17. Matlab中meshgrid的用法
  18. 实现高效安全管理云效流水线的7招 |云效
  19. Visi如何使用Weave和Docker
  20. TD源链:让区块链臻于完美

热门文章

  1. Unity Shader 学习记录(5) —— 实现漫反射光照模型
  2. ImagePicker
  3. 京东商城空调标价0元引发抢购
  4. Trove系列(七)——Trove的Mysql的复制功能介绍
  5. Lumion 11.0:领先的建筑可视化工具再次升级!+全版本安装包
  6. 经典算法研究系列:八、再谈启发式搜索算法
  7. WORD文档无法编辑解决
  8. [蓝桥杯][2018年第九届真题]小朋友崇拜圈、耐摔指数、堆的计数、缩位求和、约瑟夫环
  9. 安卓手机网上商城-2号店
  10. 2019年3月全国计算机报名入口广东,广东2019年3月全国计算机二级考试报名系统...