hdu1950 最长上升子序列nlogn】的更多相关文章

简单. #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; int a[MAXN],s[MAXN]; int serch(int left, int right, int v) { int l, r, m; l = left, r = right; while(l <= r) { m = (l + r) / ; if(v > s[m]) l = m + ;…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p排序也是一样的.但这题的n的范围是5*10^5次方,所以用n^2算法求 最长上升子序列肯定不行,下面简单介绍一下nlogn时间内求的方法: 从序列里面每次插入一个数,插入到另外一个数组里面,这个数组初始状态是空的,插入一个数时,如果这个数比这个数组里面的任何一个数都大,则直接插入到最后面,否则判断这…
转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复杂度为O(n^2)的动态规划(DP)算法,但在James W. Hunt和Thomas G. Szymansky 的论文"A Fast Algorithm for Computing Longest Common Subsequence"中,给出了O(nlogn)下限的一种算法. 定理:设…
题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp,另一种是树状数组. 变形的dp可以参考http://www.cnblogs.com/itlqs/p/5743114.html 树状数组的写法其实就是用到了树状数组求前缀最值,必要的时候可以离散化一下. #include<cstdio> #include<cstring> #includ…
分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #define N 1005 #define INF 0X3f3f3f3f using namespace std; int a[N]; int dp[N]; void solve(int n) { ;i<n;i++) { dp[i]=; ;j<i;j++)///往前找寻美妙的回忆 { if(a[j]&l…
先来个板子 #include<bits/stdc++.h> using namespace std; , M = 1e6+, mod = 1e9+, inf = 1e9+; typedef long long ll; struct node { int c; int num; } u[N]; ,n,m,x,y = ,T = ,ans = ,big = ,cas = ,num = ,len = ; ; bool cmp(node a,node b) { if (a.c==b.c) return…
openjudge 百练 2757:最长上升子序列 总时间限制:  2000ms 内存限制:  65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上…
普通的思路是O(n2)的复杂度,这个题的数据量太大,超时,这时候就得用nlogn的复杂度的算法来做,这个算法的主要思想是只保存有效的序列,即最大递增子序列,然后最后得到数组的长度就是最大子序列.比如序列7 8 9 1 2 3 来说, 就是先把第一个数输入到数组中,然后继续输入后面的数,每输入一个数都要和最后一个数比较,因为这时最后一个数一定是有效序列中最大的,如果大于最后一个数,那么就直接将它放到数组的最后就行了,如果不大于最后一个数的话,就找到第一个比他大的数,然后替换它,样例中,先输入进去7…
LIS问题是经典的动态规划问题,它的状态转移相信大家都很熟悉: f[i] = f[k] + 1  (k < i 且 A[k] < A[i]) 显然这样做复杂度是O(n^2) 有没有更快的算法呢? 当然,你会发现你在往前找的过程中实际上就是在查询最大值的过程,如果能应用二分就很有机会降到nlogn 但是原f[]序列并不满足二分性质呐..怎么办呢? 我们要的是往前长度最大的,我们的二分目标就是长度 不妨开一个长度数组len[i],表示长度为i的上升子序列最后末尾的值的最小值 对于没算出的len,设…
费了好大劲写完的  用线段树维护的 nlogn的做法再看了一下 大神们写的 nlogn  额差的好远我写的又多又慢  大神们写的又少又快时间  空间  代码量 哪个都赶不上大佬们的代码 //这是我写的 #include<iostream> #include<stdio.h> #include<map> #include<vector> #include<algorithm> #include<cstring> using namesp…