码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5068 Harry And Math Teacher( 矩阵乘法 + 线段树维护 )

时间:2014-10-22 06:19:31      阅读:272      评论:0      收藏:0      [点我收藏+]

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

 

HDU 5068 Harry And Math Teacher( 矩阵乘法 + 线段树维护 )

 

题意:


首先是这题题意理解错误,,其次是这题无法理解状态。。。

已经不是英文有多烂的情况了,是中文没学好啊。。。。。大学不学语文才是真正的硬伤啊

题目意思 有一个城堡有很多层楼, 每层楼有2个门,每个门里面又有两个楼梯,可以通往上一层的两个门

问,从x层楼到y层楼有多少中方法(不能返回)

 

 

具体看图吧,,,已经不会说话了

 

bubuko.com,布布扣

 

bubuko.com,布布扣

 

bubuko.com,布布扣
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <vector>
  5 #include <list>
  6 #include <queue>
  7 #include <map>
  8 #include <set>
  9 #include <algorithm>
 10 #include <cmath>
 11 #include <ctime>
 12 using namespace std;
 13 typedef long long LL;
 14 typedef unsigned long long ULL;
 15 #define CLR(a,b)     memset( a, b, sizeof(a) )
 16 #define REP(i,a,b)    for( int i = a; i < b; ++i )
 17 #define FOR(i,a,b)    for( int i = a; i <= b; ++i )
 18 #define FOD(i,a,b)    for( int i = a; i >= b; --i )
 19 
 20 const int MAX_SIZE = 2;
 21 const int MAXN = 50005;
 22 const int MOD = 1000000007;
 23 #define lson l, m, o << 1
 24 #define rson m + 1, r, o << 1 | 1
 25 #define ls o << 1
 26 #define rs o << 1 | 1
 27 
 28 inline void scan( int &x )
 29 {
 30     char c;
 31     while( c = getchar(), c < 0 || c >9 );
 32     x = c - 0;
 33     while( c = getchar(), c >=0 && c <= 9 ) x = x*10 + c - 0;
 34 }
 35 
 36 struct Matrix
 37 {
 38     LL matrix[MAX_SIZE][MAX_SIZE];
 39     int n;
 40     
 41     Matrix(int _n=2) : n(_n) {}
 42     void clear()
 43     {
 44         CLR(matrix,0);
 45     }
 46     void init()
 47     {
 48         REP(i,0,n)
 49             REP(j,0,n)
 50                 matrix[i][j] = (i == j);
 51     }
 52     Matrix operator * (const Matrix &a) const
 53     {
 54         Matrix c(n);
 55         c.clear();
 56         REP(i,0,n) 
 57             REP(j,0,n) 
 58                 REP(k,0,n)
 59                     c.matrix[i][j] = (c.matrix[i][j] + matrix[i][k]* a.matrix[k][j]) % MOD;
 60         return c;            
 61     }
 62 };
 63 
 64 Matrix Tree[MAXN << 2];
 65 
 66 inline void push_up( int o )
 67 {
 68     Tree[o] = Tree[ls] * Tree[rs];
 69 }
 70 
 71 void build( int l, int r, int o )
 72 {
 73     if( l == r )
 74     {
 75         for( int i = 0; i < 2; ++i )
 76             for( int j = 0; j < 2; ++j )
 77                 Tree[o].matrix[i][j] = 1;
 78         return;
 79     }
 80     int m = ( l + r ) >> 1;
 81     build( lson );
 82     build( rson );
 83     push_up( o );
 84 }
 85 
 86 void update( int x, int y, int z, int l, int r, int o )
 87 {
 88     if( l == r )
 89     {
 90         Tree[o].matrix[y][z] ^= 1;
 91         return;
 92     }
 93     int m = ( l + r ) >> 1;
 94     if( x <= m )    update( x, y, z, lson );
 95     else            update( x, y, z, rson );
 96     push_up( o );
 97 }
 98 
 99 Matrix query( int L, int R, int l, int r, int o )
100 {
101     if( L == l && R == r )
102         return Tree[o];
103     int m = ( l + r ) >> 1;
104     if( R <= m )    return query( L, R, lson );
105     else if( L > m )     return query( L, R, rson );
106     else
107     {
108         return query( L, m, lson) * query( m+1, R, rson );
109     }
110 }
111 
112 void Orz()
113 {
114     int m, n;
115     while( ~scanf( "%d %d", &n, &m ) )
116     {
117         build( 1, n - 1, 1 );
118         while( m-- )
119         {
120             int op, x, y, z;
121             scan( op ); scan( x ); scan( y );
122             if( op == 0 )
123             {
124                 Matrix res;
125                 res = query( x, y - 1, 1, n - 1, 1 );
126                 printf( "%I64d\n", ( res.matrix[0][0] + res.matrix[0][1] + res.matrix[1][0] + res.matrix[1][1] ) % MOD );
127             }
128             else 
129             {
130                 scan( z );
131                 update( x, y - 1, z - 1, 1, n - 1, 1 );
132             }
133         }
134     }
135 }
136 
137 int main()
138 {
139     Orz(); 
140     return 0;
141 }
代码君

 

HDU 5068 Harry And Math Teacher( 矩阵乘法 + 线段树维护 )

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

原文地址:http://www.cnblogs.com/BigBallon/p/4042064.html

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