poj 2481 树状数组
2014-07-16 18:00
176 查看
要用sort,qsort会超时
第一道树状数组,累死了,简直不像写题解
AC代码如下:
第一道树状数组,累死了,简直不像写题解
AC代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 100000; int q1[MAX_N+5], f1, e1; int q2[MAX_N+5], f2, e2; int dp1[MAX_N+5], dp2[MAX_N]; int cnt1[MAX_N+5], cnt2[MAX_N+5]; int num[MAX_N+5]; int N; int find1( int f, int e, int n ){ int l = f, r = e, mid; while( l <= r ){ mid = ( l + r ) / 2; if( n <= q1[mid] ){ r = mid - 1; }else{ l = mid + 1; } } return r; } int calc1( int f, int e, int n ){ int l = f, r = e, mid; while( l <= r ){ mid = ( l + r ) / 2; if( q1[mid] > n ){ r = mid - 1; }else{ l = mid + 1; } } return r - f + 1; } int find2( int f, int e, int n ){ int l = f, r = e, mid; while( l <= r ){ mid = ( l + r ) / 2; if( n >= q2[mid] ){ r = mid - 1; }else{ l = mid + 1; } } return r; } int calc2( int f, int e, int n ){ int l = f, r = e, mid; while( l <= r ){ mid = ( l + r ) / 2; if( q2[mid] < n ){ r = mid - 1; }else{ l = mid + 1; } } return r - f + 1; } void DP1(){ dp1[N-1] = 1; e1 = N - 1; f1 = N - 1; cnt1[N-1] = 1; q1[f1] = num[N-1]; for( int i = N - 2; i >= 0; i-- ){ if( num[i] <= q1[f1] ){ f1--; q1[f1] = num[i]; dp1[i] = e1 - f1 + 1; cnt1[i] = calc1( f1, e1, num[i] ); }else{ int pos = find1( f1, e1, num[i] ); q1[pos] = num[i]; dp1[i] = e1 - pos + 1; cnt1[i] = calc1( pos, e1, num[i] ); } // cout << f1 << "***" << e1 << endl; // for( int i = f1; i <= e1; i++ ){ // cout << q1[i] << " "; // } // cout << endl; } } void DP2(){ dp2[N-1] = 1; e2 = N - 1; f2 = N - 1; cnt2[N-1] = 1; q2[f2] = num[N-1]; for( int i = N - 2; i >= 0; i-- ){ if( num[i] >= q2[f2] ){ f2--; q2[f2] = num[i]; dp2[i] = e2 - f2 + 1; cnt2[i] = calc2( f2, e2, num[i] ); }else{ int pos = find2( f2, e2, num[i] ); q2[pos] = num[i]; dp2[i] = e2 - pos + 1; cnt2[i] = calc2( pos, e2, num[i] ); } } } int main(){ int T; scanf( "%d", &T ); while( T-- ){ scanf( "%d", &N ); for( int i = 0; i < N; i++ ){ scanf( "%d", &num[i] ); } DP1(); DP2(); int ans = 0; for( int i = N - 1; i >= 0; i-- ){ ans = max( ans, dp1[i] + dp2[i] - min( cnt1[i], cnt2[i] ) ); } cout << ans << endl; } return 0; }
相关文章推荐
- poj 2481 树状数组(覆盖每个区间的区间个数)
- POJ 2481 Cows 树状数组
- poj 2481 Cows(哇咔咔,树状数组^ ^)
- Cows(poj 2481 树状数组)
- POJ 2481:Cows 树状数组
- POJ 2481 Cows (线段树||树状数组)
- POJ 2481 Cows 树状数组
- poj 2299 poj 2481 树状数组
- poj 2481 树状数组
- poj 2481 cows 树状数组
- POJ 2481:Cows 树状数组
- poj 2481 Cows 树状数组
- POJ 2481 cows 树状数组
- 树状数组水题小结 Poj 2352 + 2481 + 3067
- poj 2481 树状数组
- poj2352+2481 stars+cows 树状数组
- 树状数组简单poj 2481
- poj 2481 树状数组
- POJ 2481 树状数组
- poj 2481 cows 树状数组