hdu-4548-树状数组

这题 我一开始 以为是 数位DP 真心被DP给吓到了 一看到给个区间 然后求符合某个特点的数 就TM想到了数位DP..

然后 反正 我找不出状态 =-=

因为 这题的数据范围不大的原因 我就可以用树状数组做 才100W啊

一般其实用dp的话 可能都是要10^9吧

这题 蛮好的 又要用掉这筛选素数的方法 叫什么名来着 我忘记了 也懒得去查了 .

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int size = 1000010;
 6 int prime[size/10];
 7 bool vis[size];
 8 int tree[size];
 9 
10 int lowBit( int x )
11 {
12     return x & (-x);
13 }
14 
15 void update( int x , int var )
16 {
17     while( x<size )
18     {
19         tree[x] += var;
20         x += lowBit(x);
21     }
22 }
23 
24 int getSum( int x )
25 {
26     int ans = 0;
27     while( x )
28     {
29         ans += tree[x];
30         x -= lowBit(x);
31     }
32     return ans;
33 }
34 
35 bool solve( int x )
36 {
37     int sum = 0;
38     while( x )
39     {
40         sum += x%10;
41         x /= 10;
42     }    
43     if( vis[sum] )
44         return true;
45     return false;
46 }
47 
48 void init( )
49 {
50     int cnt = 0;
51     memset( vis , true , sizeof(vis) );
52     memset( tree , 0 , sizeof(tree) );
53     vis[1] = true;
54     for( int i = 2 ; i<size ; ++i )
55     {
56         if( vis[i] )
57         {
58             prime[cnt++] = i;
59             int j = i + i;
60             while( j<size )
61             {
62                 vis[j] = false;
63                 j += i;
64             }            
65         }
66     }
67     for( int i = 0 ; i<cnt ; ++i )
68     {
69         if( solve( prime[i] ) )
70         {
71             update( prime[i] , 1 );
72         }
73     }
74 }
75 
76 int main()
77 {
78     cin.sync_with_stdio(false);
79     int t , ans , L , R;
80     init();
81     cin >> t;
82     for( int k = 1 ; k<=t ; ++k )
83     {
84         cin >> L >> R;
85         ans = getSum(R) - getSum(L-1);
86         cout << "Case #" << k << ": " << ans << endl;
87     }
88     return 0;
89 }
View Code

 

today:

  贼烦咯.

  是不是追女孩子越用真心越得不到

  还是越不在乎才能得到

  我也是醉了

 

posted @ 2014-10-21 22:54  radical  阅读(165)  评论(0编辑  收藏  举报