记录一下,O(nlgn)的算法求LIS //HHH #include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define MX 1005 int num[MX]; int dp[MX]; int high[MX]; // 长为i的最小大小 int bi_search(int x,int h) { ,r=h; ; while (l<=r) { ; if (x&g…
这道题题目给的顺序不是固定的 所以一开始要自己排序,按照w来排序 后来只要看l就可以了 然后求最长下降子序列即可(根据那个神奇的定理,LIS模板里有提到) #include<cstdio> #include<algorithm> #include<cstring> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 1123; struc…
题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d. 分析: 1.线段树 由于给定的元素的取值范围为0-10^5,因此维护一棵线段树,其中[l, r]的信息表示处理完前k个数时,序列最大元素落在[l, r]区间最长上升子序列的长度.从前往后处理给定的数组,处理到第 i 号元素时,更新第 i - d 号元素,这样就能够保证最长上升的序列间隔大于d,更新是需要更新到叶子节点的,但这里更新是单点更新,每次更新的位置是该元素的值,信息就…
题目大意:给你一个序列,要你求该序列中最长严格上升子序列的长度. 解题思路:此题算是一道LIS模板题.普通的$O(n^2)$的LIS是会TLE的,因为$n\le 1000000$,所以此题要用单调队列优化的LIS,时间复杂度$O(n\log n)$. C++ Code: #include<cstdio> #include<algorithm> using namespace std; int n,k,q[1000005],a[1000005]; int main(){ k=0; s…