【[TJOI2014]上升子序列】】的更多相关文章

5157: [Tjoi2014]上升子序列 题目:传送门 题解: 学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬) 离散化之后,用一个数组记录一下,直接树状数组做 吐槽:妈耶...一开始不会lower_bound 的蒟蒻用手打二分离散化...结果去重了...然后屁颠屁颠的学了lower_bound(很好用!) 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath&…
题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献(即以它上一次出现的位置为最后一个元素的上升子序列数目)统计到答案中. 由于要包含至少两个元素,因此还需要减掉不同数的数目. 时间复杂度 $O(n\log n)$ #include <cstdio> #include <algorithm> #define N 100010 #defin…
这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\(dp[i]=\sum_{j=1}^{i-1}dp[j]\) 这个暴力转移是\(O(n^2)\)的,我们这里可以直接用树状数组来优化,于是就变成了\(O(nlogn)\) 同时由于数字可能非常大,所以需要离散化 之后再来考虑一下如何去重 首先重复的情况肯定是来自于一个之前已经出现过的数,而这个出现的数又将所有之…
https://www.lydsy.com/JudgeOnline/problem.php?id=5157 https://www.luogu.org/problemnew/show/P3970 给定一个只包含整数的序列(序列元素的绝对值大小不超过10^9),你需要计算上升子序列的个数,满足如下条件的称之为一个上升子序列: 是原序列的一个子序列 长度至少为2 所有元素都严格递增 如果两个上升子序列相同,那么只需要计算一次.例如:序列{1,2,3,3}有4个上升子序列,分别为{1,2}{1,3},…
刚刚做的时候一看:这不是个傻逼题吗hhhhh....然后发现写完了过不了样例,仔细一看题:同构的算一种. 这可咋办啊? 其实很简单,设f[i] 为 以a[i] 结尾的上升子序列个数,我们考虑当前如果算到 i 了,那么我们需要查询 a[j] < a[i] 且 j < i 的所有 的 f[j] 的和. 为了避免重复计算,我们只需要保留每个权值的j最大的那个就行了,因为那个 j 肯定可以包含之前的所有答案. 所以我们边计算边维护即可. #include<bits/stdc++.h> #d…
传送门 DP 十分显然的DP,但是不好写 设 f[ i ] 表示以第 i 个数作结尾时的方案数,原序列为 a 如果不考虑相同的序列: 那么转移就是 Σ f[ j ] (0< j < i && a [ j ] < a [ i ]) 复杂度为 O(n^2) 考虑优化: 先去重 ,得到数组 b 每次把f [ i ] 加到树状数组里 a [ i ]的值 在 b 中的位置 的位置 那么 f [ i ] 就等于 query(a [ i ] 的值在 b 中的位置-1) (query为树…
题目链接 BZOJ5157 题解 我们只需计算每个位置为开头产生的贡献大小,就相当于之后每个大于当前位置的位置产生的贡献 + 1之和 离散化后用树状数组维护即可 要注意去重,后面计算的包含之前的,记录下来减去即可 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define…
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对于算法导论的版本,增加了一个多分支回溯,即存储回溯方向时出现了向上向左都可以的情况时,这时候就代表可能有多个最长公共子序列.当回溯到这里时,让程序带着存储已经回溯的字符串的栈进行递归求解,当走到左上角的时候输出出来 # coding=utf-8 class LCS(): def input(self…
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根据数星星的经验,一个点一个点更新可以解决1到i-1的问题,然后线段树是维护最大值,那么A[j]<A[i]的条件就用查询区间保证,即查询:1到A[i]的f[i]最大值.为了不溢出,因此需要离散化. 附代码: #include<cstdio> #include<algorithm>…
A sequence of numbers is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same. For example, these are arithmetic sequences: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 The follo…