某考试 T1 arg
题目描述
给出一个长度为 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;
}
某考试 T1 arg的更多相关文章
- T2 Func<in T1,out T2>(T1 arg)
委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...
- 考试T1总结(又CE?!)
考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...
- 某考试T1 game
题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...
- 某考试 T1 lcm
把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...
- 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)
\(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...
- 2019.2.14 考试T1 FFT
\(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...
- 某考试 T1 fair (18.5.1版)
转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于 C(n,n/2)/2 ...
- 某考试 T1 str
一开始死磕sam,发现根本没法做...... 后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊! 就是假设我们要让 s1[1] 映射到 ...
- 某考试 T1 monopoly
可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...
随机推荐
- win应用只允许单个实例运行,并将已运行实例窗口置顶
关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...
- github 下载全部项目
从github下载资料过程中,有些项目含有子模块,有时通过git clone 或者下载zip方式项目可能会缺少文件,因此需要执行 git submodule update --init --recur ...
- Lampiao(dirtycow)脏牛漏洞复现
nmap扫描内网80端口发现目标主机 nmap -sP -p 80 192.168.31.0/24 扫描发现目标主机开放22端口.并且 1898端口开放http服务 御剑扫描目录并访问之后发现存 ...
- this.treeData = JSON.parse(JSON.stringify(this.d)) 树的序列化反序列化
this.treeData = JSON.parse(JSON.stringify(this.d))
- Caused by: java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.bj186.crm.mapper.UserMapper.Integer
在使用SSM整合myBatis的过程中遇到了这个问题. 问题的原因: 把parameterType错误的写成了parameterMap 解决办法: 将parameterMap修改为parameterT ...
- xlsx 读取文件日期问题
xlsx 的版本:0.13.5,可以取到日期 xlsx 的版本:0.14.3,取到的日期转为数字了,没有找到方法转为日期, 可以开启 cellDates: true,但是这个时区不对, dateN ...
- 数据库课程设计 PHP web实现
纪念一下自己写的东西.. 都说很垃圾就是了 直接用XAMPP做的 菜鸟网上学的PHP和HTML <!DOCTYPE html> <html> <head> < ...
- JSP页面通过c:forEach标签循环遍历List集合
c:forEach>标签有如下属性: 属性 描述 是否必要 默认值items 要被循环的信息 否 无begin 开始的元素(0=第一个元素,1=第二个元素) 否 0end 最后一个元素(0=第一 ...
- Win10任务栏搜索框无法搜索,显示白色页面
如果确定: Windows search服务启动打开 %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\Local ...
- JS第三方中间件的延伸
js中间件 当我们在编写业务代码时候,我们无法避免有些业务逻辑复杂而导致业务代码写得又长又乱,如果再加上时间紧凑情况下写出来的代码估计会更让人抓狂.以至于我们一直在寻求更好的架构设计和更好的代码设计, ...