2012年每週一賽第二場第二題,高效模擬問題。說白了就是一個骰子轉來轉去的問題,每次翻轉產生的變化可以自由模擬,這不是問題。問題是如果是直接模擬的話,時間複雜度是O(RC),而R和C分別都可以高達100000,它們的積就過於大了。而事實上,在每一行中翻轉時,每翻轉4次就會回到原位,那麼實際上需要模擬的就只是R*C%4次而已,這樣就可以把問題化簡了。
Run Time: 0.01sec
Run Memory: 304KB
Code Length: 1264Bytes
Submit Time: 2012-03-03 20:10:23
// Problem#: 4874
// Submission#: 1231193
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <cstdio>
#include <string>
using namespace std;
struct Cube {
string number;
Cube() { number = "136425"; }
int show( int i ) { return number[ i ] - '0'; }
void right() {
char temp = number[ 0 ];
number[ 0 ] = number[ 3 ];
number[ 3 ] = number[ 2 ];
number[ 2 ] = number[ 1 ];
number[ 1 ] = temp;
}
void down() {
char temp = number[ 0 ];
number[ 0 ] = number[ 5 ];
number[ 5 ] = number[ 2 ];
number[ 2 ] = number[ 4 ];
number[ 4 ] = temp;
}
void left() {
char temp = number[ 0 ];
number[ 0 ] = number[ 1 ];
number[ 1 ] = number[ 2 ];
number[ 2 ] = number[ 3 ];
number[ 3 ] = temp;
};
};
int main()
{
Cube cube;
int R, C;
int i, j;
long long sum = 0;
scanf( "%d%d", &R, &C );
for ( i = 1; i <= R; i++ ) {
sum += C / 4 * ( cube.show( 0 ) + cube.show( 1 ) + cube.show( 2 ) + cube.show( 3 ) );
for ( j = 1; j < C % 4; j++ ) {
sum += cube.show( 0 );
i % 2 == 1 ? cube.right(): cube.left();
}
if ( j == C % 4 )
sum += cube.show( 0 );
cube.down();
}
printf( "%lld\n", sum );
return 0;
}