首页 > 代码库 > 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 }
hdu--2227--dp<线段树/树状数组>优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。