题目描述

给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS.

输入格式

第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A.

输出格式

一行一个整数表示答案.

样例

Input:

  1. 5 3
  2. 1 3 4

Output:

  1. 11

数据范围与提示

对于前 30% 的数据, n ≤ 9;

对于前 60% 的数据, n ≤ 12;

对于 100% 的数据, 1 ≤ m ≤ n ≤ 15.

我们可以很自然的想到用f[S][s]表示目前选了S中的数,并且LIS的状态是s的方案数。这样的话转移就考虑把还没出现的数加入,再考虑其对s的影响就可以找到下一个状态了,但是这里还有两个需要注意的事情:

1.如何保证最后的LIS中有a[] ?

这个还是比较好解决的,我们只需要再两个地方判定就行了:1.如果加入的数是给出的a[]中的一个元素a[i],我们需要判断S中是否包含所有a[1],,,a[i-1];2.最后我们计算答案的时候,只能加s状态的LIS=m的f[2^n-1][s] ,因为这样才能保证a[]是LIS中的一个。

2.看起来状态是有 (2^n)^2 个的,会不会炸掉?

简单分析就可以知道,s肯定是S的一个子集,因为只有出现过了才可能在LIS的队列中出现。所以其实状态最多只有 3^n个。(但我真的写不出3进制的操作啊,只好用map强行套个log)

(然后我来回答一下为什么我考试的时候这个题爆零了23333,考试的时候我的程序就和现在的很接近了,但是我把题目看成LIS必须只能是给出的数列而不是有很多LIS共存,然后就怒WA10个点  (出题人来解释一下为什么这样能过样例233333))

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<tr1/unordered_map>
  7. #include<algorithm>
  8. #define ll long long
  9. using namespace std;
  10. using namespace std::tr1;
  11. const int maxn=40005;
  12. unordered_map<int,int> mmp[maxn];
  13. int ci[66],n,m,sum[maxn],a[20];
  14. int to[maxn][20],pos[20],tmp[20];
  15.  
  16. inline void init(){
  17. ci[0]=1;
  18. for(int i=1;i<=30;i++) ci[i]=ci[i-1]<<1;
  19. for(int i=1;i<ci[n];i++) sum[i]=sum[i^(i&-i)]+1;
  20. for(int i=1;i<ci[n];i++)
  21. for(int j=1;j<=n;j++){
  22. to[i][j]=i;
  23. for(int k=j-1;k<n;k++) if(ci[k]&i){
  24. to[i][j]^=ci[k];
  25. break;
  26. }
  27. to[i][j]|=ci[j-1];
  28. }
  29. }
  30.  
  31. inline void solve(){
  32. for(int i=1;i<=n;i++) if(pos[i]<=1) mmp[ci[i-1]][ci[i-1]]=1;
  33. for(int S=1;S<ci[n];S++)
  34. for(int s=S,TS,ts,now;s;s=(s-1)&S) if(mmp[S].count(s)){
  35. now=mmp[S][s];
  36. for(int k=1;k<=n;k++) if(!(ci[k-1]&S)){
  37. if(pos[k]&&(S&tmp[pos[k]])!=tmp[pos[k]]) continue;
  38. TS=S|ci[k-1];
  39. ts=to[s][k];
  40. mmp[TS][ts]+=now;
  41. }
  42. }
  43.  
  44. int ans=0;
  45. for(int i=1;i<ci[n];i++) if(sum[i]==m) ans+=mmp[ci[n]-1][i];
  46. printf("%d\n",ans);
  47. }
  48.  
  49. int main(){
  50. // freopen("arg.in","r",stdin);
  51. // freopen("arg.out","w",stdout);
  52.  
  53. scanf("%d%d",&n,&m),init();
  54. for(int i=1;i<=m;i++) scanf("%d",a+i),pos[a[i]]=i;
  55. tmp[1]=0;
  56. for(int i=2;i<=m;i++) tmp[i]=tmp[i-1]|ci[a[i-1]-1];
  57. solve();
  58. return 0;
  59. }

  

某考试 T1 arg的更多相关文章

  1. T2 Func<in T1,out T2>(T1 arg)

    委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...

  2. 考试T1总结(又CE?!)

    考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...

  3. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  4. 某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...

  5. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  6. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  7. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  8. 某考试 T1 str

    一开始死磕sam,发现根本没法做...... 后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊! 就是假设我们要让 s1[1] 映射到 ...

  9. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

随机推荐

  1. Docker - Image创建

    自己创建Image会有一些好处,可以选择最新的版本,而且从国内的镜像创建时更新软件也会从该镜像获取,速度更快. (1)安装debootstrap zhouh1@uhome:/media/zhouh1/ ...

  2. JDBC优化策略总结

    相比Hibernate.iBatis.DBUtils等,理论上JDBC的性能都超过它们.JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的.   在一些高性能的数据操作中, ...

  3. Codeforces 1076D——最短路算法

    题目 给你一个有n个顶点.m条边的无向带权图.需要擦除一些边使得剩余的边数不超过k,如果一个点在原始图到顶点1的最短距离为d,在删边后的图中到顶点的最短距离仍是d,则称这种点是 good.问如何删边, ...

  4. dircolors - 设置‘ls'显示结果的颜色

    SYNOPSIS[总览] dircolors [-b] [--sh] [--bourne-shell] [-c] [--csh] [--c-shell] [-p] [--print-database] ...

  5. C++静态全局变量和全局变量的区别

      静态全局变量 非静态全局变量 存储方式 静态存储 静态存储 作用域 定义该变量的源文件内 所有源文件 解释: 共同点:全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量.全 ...

  6. C-基础:数组名与取地址符&

    指出下面代码的输出,并解释为什么.(不错,对地址掌握的深入挖潜) main() { ]={,,,,}; ); printf(),*(ptr-)); } 输出:2,5     *(a+1)就是a[1], ...

  7. docker-compose nginx

    docker-compose nginx example source code docker-compose nginx balancing

  8. process data

    # version 1.0def connect_mysql(sql, oper_type="select", data_l=None): conn = pymysql.conne ...

  9. UVa-1586-分子量

    这是一道字符串的题目,我们直接对字符串进行解析,然后计算就可以了. 我是直接开了两个数组存入对应的值,没有进行判断,我们如果在if判断里面直接增加了i的值,最好先把对应的字符存起来,然后这样才不容易出 ...

  10. 9. FILES

    9. FILES FILES表提供有关存储MySQL表空间数据的文件的信息. FILES表提供有关InnoDB数据文件的信息. 在NDB Cluster中,此表还提供有关存储NDB Cluster D ...