hdu 5141 二分法求最长上升子序列,扫描法求解
2014-12-25 19:21
246 查看
题目:
题目分析:
设区间的左右边界,左右边界只要有一个边界不同,那么他们定义为不同区间
这道题就是求包含最长上升子序列的区间的总数
代码及思路如下
题目分析:
设区间的左右边界,左右边界只要有一个边界不同,那么他们定义为不同区间
这道题就是求包含最长上升子序列的区间的总数
代码及思路如下
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #define MAX 100100 using namespace std; long long a[MAX];// 存的是读取的数 long long c[MAX];//记录序列长度为下标时的结束的最靠右的元素的下标 long long dp[MAX];//记录以当前元素结尾的序列的最大长度 long long first[MAX];//记录以当前元素结尾的序列的最大长度的序列最靠右的起点 int n; //寻找到当前节点作为末尾元素的序列最长时的长度 int bsearch ( long long num ) { int left = 0 , right = n , mid; while ( left != right ) { mid = left + right >> 1; if ( num > a[c[mid]] && num <= a[c[mid+1]] ) return mid; if ( num > a[c[mid]] ) left = mid+1; else right = mid; } return left; } int main ( ) { while ( ~scanf ( "%d" , &n ) ) { for ( int i = 1 ; i <= n ; i++ ) scanf ( "%lld" , &a[i]) ; int ans = 0; memset ( c , 0 , sizeof ( c ) ); c[0] = 100007; a[100007] = 0; a[0] = 0xffffffff; long long temp; for ( int i = 1; i <= n ; i++ ) { temp = bsearch ( a[i] ); if ( temp == 0 ) first[i] = i; else first[i] = first[c[temp]]; ( a[i] <= a[c[temp+1]] ) && (c[temp+1] = i ); ans = max ( temp + 1, ans*1LL ); dp[i] = temp + 1; } long long res = 0; for ( int i = 1 ; i <= n ; i++ ) { if ( dp[i-1] == ans ) if ( dp[i] < dp[i-1] ) dp[i] = dp[i-1] , first[i] = first[i-1]; if ( dp[i] == ans ) res += first[i]; } printf ( "%lld\n" , res ); } }
相关文章推荐
- HDU 1025 DP+二分求解最长上升序列
- 【线段树+O(nlgn)最长上升子序列】HDU 3564
- hdu 1950 Bridging signals--二分法求最长上升子序列
- hdu 4604 Deque(最长上升与下降子序列-能够重复)
- hdu 1025 Constructing Roads In JGShining's Kingdom(最长上升序列n*logn算法)
- 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
- hdu 1087 Super Jumping! Jumping! Jumping!(最长上升子序列变形)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
- hdu 1025 Constructing Roads In JGShining's Kingdom 最长上升序列
- hdu 4352 统计数字数位上最长上升子序列长度为k的个数
- O(nlgn)求解最长上升子序列长度
- hdu 1069 Monkey and Banana(类似最长上升子序列,dp)
- hdu 1025 Constructing Roads In JGShining's Kingdom【即求最长上升子序列】
- 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
- HDU 3308【线段树-query:区间最长单调上升序列,update:结点更新,区间合并】
- 【最长上升子序列】杭电 hdu 1257 最少拦截系统
- HDU 1025 高效最长上升子序列(二分查)
- HDU 3308 最长上升连续子序列 (线段树)
- HDU 1087 Super Jumping! Jumping! Jumping!(最长上升子序列,dp)
- 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!