码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-19 00:34:49      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   color   os   sp   for   

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

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

又学到了。

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

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

bubuko.com,布布扣
 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<线段树/树状数组>优化

标签:style   blog   http   ar   io   color   os   sp   for   

原文地址:http://www.cnblogs.com/radical/p/4172927.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!