首页 > 代码库 > hdu--2227--dp<线段树/树状数组>优化

hdu--2227--dp<线段树/树状数组>优化

一开始写了发 直接O(n^2)的 tle = =

后来 看了别人的 原来可以这样优化

又学到了。

本来想多说点关于这个优化细节的  有点烦 不想说什么了 自己看下代码吧    

很多时候 dp都需要优化= =

 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5  6 typedef __int64 LL; 7 int n , cnt; 8 const int mod = 1000000007; 9 const int size = 100010;10 LL tree[size];11 int a[size] , b[size];12 13 int lowBit( int x )14 {15     return x & -x;16 }17 18 void update( int x , LL var )19 {20     while( x<=cnt-1 )21     {22         tree[x] += var;23         tree[x] %= mod;24         x += lowBit( x );25     }26 }27 28 LL getSum( int x )29 {30     LL sum = 0;31     while( x )32     {33         sum += tree[x];34         sum %= mod;35         x -= lowBit( x );36     }37     return sum;38 }39 40 LL solve( )41 {42     LL sum = 0;43     int Id;44     LL var;45     for( int i = 1 ; i<=n ; i++ )46     {47         Id = lower_bound( b+1 , b+cnt , a[i] ) - b;48         var = getSum( Id ) + 1;49         sum += var;50         sum %= mod;51         update( Id , var );52     }53     return sum;54 }55 56 int main()57 {58     cin.sync_with_stdio(false);59     int num;60     while( cin >> n )61     {62         memset( tree , 0 , sizeof(tree) );63         for( int i = 1 ; i<=n ; i++ )64         {65             cin >> num;66             a[i] = b[i] = num;67         }68         sort( b+1 , b+n+1 );69         cnt = unique( b+1 , b+n+1 ) - b;70         cout << solve( ) << endl;71     }72     return 0;73 }
View Code

 

hdu--2227--dp<线段树/树状数组>优化