摘要: 考虑O(n log n)的LIS求法,dp[i]表示到目前为止,长度为i的LIS的末尾最小是多少。 当当前数确定时直接用LIS的求法更新dp数组,当不确定时,由于这个数可以是任意数,所以可以接在任意上升子序列后面,于是相当于所有dp[i]=min(dp[i],dp[i-1]+1),也就是整个数组+1 阅读全文
posted @ 2018-11-05 17:43 HocRiser 阅读(183) 评论(0) 推荐(0) 编辑
摘要: [l,r]中所有数排序后能构成公差为k的等差数列,当且仅当: 1.区间中最大数-最小数=k*(r-l) 2.k能整除区间中任意两个相邻数之差,即k | gcd(a[l+1]-a[l],a[l+2]-a[l+1],...,a[r]-a[r-1]) 3.区间中任意两个数不相同,即设pre[i]为序列中i 阅读全文
posted @ 2018-11-05 15:15 HocRiser 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 先用树状数组求出g[i]表示长度为i的不降子序列个数。$O(n^2\log n)$ 容斥,最终序列长度为i的方案数为g[i]*(n-i)!,但这里多计算了在删得只剩i个数之前就已经构成不降子序列的情况。 这时考虑最后是从哪个不降子序列删掉一个数的,g[i+1]*(n-i-1)!*(i+1),这里显然 阅读全文
posted @ 2018-11-05 11:04 HocRiser 阅读(224) 评论(0) 推荐(0) 编辑
摘要: f[i][j]表示从小到大插入前i个数,有j个位置不合法(即有j对相邻数)的方案数。 转移时要考虑插入的位置以及i-1的情况,于是增设一维0/1/2记录i-1和左边的数相邻/和右边的数相邻/不和两边相邻。暴力转移即可。 阅读全文
posted @ 2018-11-05 09:05 HocRiser 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果。 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多少,这个操作通过将询问逆序使用并查集支持。 阅读全文
posted @ 2018-11-05 09:02 HocRiser 阅读(266) 评论(0) 推荐(0) 编辑