题目描述

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

输入格式

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

输出格式

一行一个整数表示答案.

样例

Input:

5 3
1 3 4 

Output:

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))

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<tr1/unordered_map>
#include<algorithm>
#define ll long long
using namespace std;
using namespace std::tr1;
const int maxn=40005;
unordered_map<int,int> mmp[maxn];
int ci[66],n,m,sum[maxn],a[20];
int to[maxn][20],pos[20],tmp[20];inline void init(){ci[0]=1;for(int i=1;i<=30;i++) ci[i]=ci[i-1]<<1;for(int i=1;i<ci[n];i++) sum[i]=sum[i^(i&-i)]+1;for(int i=1;i<ci[n];i++)for(int j=1;j<=n;j++){to[i][j]=i;for(int k=j-1;k<n;k++) if(ci[k]&i){to[i][j]^=ci[k];break;}to[i][j]|=ci[j-1];}
}inline void solve(){for(int i=1;i<=n;i++) if(pos[i]<=1) mmp[ci[i-1]][ci[i-1]]=1;for(int S=1;S<ci[n];S++)for(int s=S,TS,ts,now;s;s=(s-1)&S) if(mmp[S].count(s)){now=mmp[S][s];for(int k=1;k<=n;k++) if(!(ci[k-1]&S)){if(pos[k]&&(S&tmp[pos[k]])!=tmp[pos[k]]) continue;TS=S|ci[k-1];ts=to[s][k];mmp[TS][ts]+=now;}}int ans=0;for(int i=1;i<ci[n];i++) if(sum[i]==m) ans+=mmp[ci[n]-1][i];printf("%d\n",ans);
}int main(){
//  freopen("arg.in","r",stdin);
//  freopen("arg.out","w",stdout);scanf("%d%d",&n,&m),init();for(int i=1;i<=m;i++) scanf("%d",a+i),pos[a[i]]=i;tmp[1]=0;for(int i=2;i<=m;i++) tmp[i]=tmp[i-1]|ci[a[i-1]-1];solve();return 0;
}

  

转载于:https://www.cnblogs.com/JYYHH/p/8646022.html

某考试 T1 arg相关推荐

  1. T2 Funcin T1,out T2(T1 arg)

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

  2. 某考试 T1 monopoly

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

  3. 【2020模拟考试T1】【PAT乙】1031 查验身份证 (15分)模拟

    problem 1031 查验身份证 (15分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10, ...

  4. 「小组联考」第二周三次考试

    「小组联考」第二周三次考试 T1 「JOISC 2016 Day 3」电报 题目 考场思考 正解 T2 「CQOI2016」路由表 题目 考场思考 正解 T3 「NOIP2014」飞扬的小鸟 题目 考 ...

  5. 14届蓝桥青少选拔赛2022年8月21日C++中高级在线考试

    蓝桥青少2022年8月21日C++中高级在线考试 T1.编程实现:个位数 题目描述: 给定一个正整数N(10<N<1000),输出正整数个位上的数字. 输入描述 输入一个正整数N(10&l ...

  6. 省选前的计划(日更,然而你们天天吊打我)

    还有17天就省选了,不能再颓废了! 总结篇(不定期更新) 网络流基本 计算几何基本 字符串入门+基础 斜率优化dp 日记篇(日更) 3.18 今天做了一些题目吧. 考试的题目也做了一道题目. 方格取数 ...

  7. [CLR via C#]17. 委托

    原文:[CLR via C#]17. 委托 回调函数是一种非常有用的编程机制,它已经存在很多年了.Microsoft .NET Framework通过委托(delegate)来提供一种回调机制.不同于 ...

  8. BZOJ 1711: [Usaco2007 Open]Dining吃饭

    1711: [Usaco2007 Open]Dining吃饭 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 902  Solved: 476 [Subm ...

  9. NOIP2017大爆炸

    回归文化课第12天.... 在这段时间内也好好回顾了一下为期不久的一年的OI生涯,想了很多... $Day0$ 早上收到班上福利----祝福卡片一份,感动. 上午随便写水题...发现水题都要好久,感觉 ...

最新文章

  1. ESXi6.5环境搭建(一:VMware Workstations 12 Pro 环境的安装及配置)
  2. php mysql 多行查找_PHP使用mysqli同时执行多条sql查询语句的实例
  3. $each $position $sort $slice
  4. php对json随机排序,按月对PHP JSON数组进行排序
  5. 我的微信luogantt
  6. 配置 Powerline 到 Vim
  7. 关于Android定制Launcher
  8. 现代软件工程系列 学生的精彩文章 (1)
  9. 中livechart显示大数据_Servlet中利用jdbc加载显示数据
  10. php assert or,什么是PHP断言(assert)?该如何使用?
  11. linkedin api php,php – 如何使用linkedin api发送消息/通知?
  12. 中国开发者真实画像:Java长盛,偏爱Windows操作系统,鲜少参与开源项目
  13. docker基础容器中bash: vi: command not found问题解决
  14. Android反射set/get系统属性(SystemProperties)
  15. 不同系统的Single Sign On(单点登录)
  16. 嵌入式单片机高级篇(一)Stm32F103电容触摸按键
  17. Qt系列文章之 QAbstractItemModel(上)
  18. 【Unity3D】枪战游戏—弹孔设置
  19. 红岭创投黑名单批量导入
  20. VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等

热门文章

  1. vue element form 自定义校验1(字段校验)
  2. pytorch torchvision.transforms.ToTensor
  3. python sqlite
  4. python abc
  5. BS4 find_all
  6. Elasticsearch SQL插件
  7. java 类变量方法实例对象方法
  8. java 监听器能监听宕机_java内存泄漏与内存溢出
  9. 泰语7个元音变形_泰语发音规则
  10. python调用pipe_Python multiprocessing模块中的Pipe管道使用实例