Linux学习笔记――Linux基础命令总结
2015-08-23 19:40
671 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) int const N= 302; int mat , n, q, pos ; int dMin[9][9] ; void initRMQ(){ int i, j, u, v, a, b, c, d; for( pos[0]= -1, i= 1; i<= n; ++i ) pos[i]= ( ( i& (i- 1) )== 0 )? pos[i- 1]+ 1: pos[i- 1]; for( i= 0; i<= pos ; ++i ) for( j= 0; j<= pos ; ++j ) for( u= 1; u<= n+ 1- (1<<i); u++ ) for( v= 1; v<= n+ 1- (1<<j); v++ ){ if( i== 0 && j== 0 ) continue; if( i== 0 ) dMin[i][j][u][v]= min( dMin[i][j- 1][u][v], dMin[i][j- 1][u][v+ (1<<(j- 1))] ); else dMin[i][j][u][v]= min( dMin[i- 1][j][u][v], dMin[i- 1][j][u+ (1<<(i- 1))][v] ); } } int askRMQ( int x1, int y1, int x2, int y2 ){ int x= pos[x2- x1+ 1], y= pos[y2- y1+ 1]; int a= min( dMin[x][y][x1][y1], dMin[x][y][x2- (1<<x)+ 1][y1] ); int b= min( dMin[x][y][x1][y2- (1<<y)+ 1], dMin[x][y][x2- (1<<x)+ 1][y2- (1<<y)+ 1] ); return min(a,b); } int main(){ int test; scanf("%d", &test ); while( test-- ){ scanf("%d",&n ); for( int i= 1; i<= n; ++i ) for( int j= 1; j<= n; ++j ){ scanf("%d", &mat[i][j] ); dMin[0][0][i][j]= mat[i][j]; } initRMQ(); scanf("%d", &q ); int x1, y1, x2, y2; for( int i= 0; i< q; ++i ){ scanf("%d%d%d%d", &x1, &y1, &x2, &y2 ); printf("%d\n", askRMQ( x1, y1, x2, y2 ) ); } } return 0; }
相关文章推荐
- Linux C++ 服务器端学习方法
- Linux学习日记--基础命令(1)--ls,帮助,LFS
- CentOS6配置本地光盘yum源
- linux:vim基础
- 820作业,常用命令
- Arch Linux 下Android 源码的下载以及编译
- Linux 脚本初探
- linux默认头文件
- linux安装mysql yum No package mysql-server available.
- 在MAC下如何用SSH连接远程LINUX服务器
- Linux常用命令和简单知识
- linux下sudo增添日志文件
- Linux 添加交换分区的步骤
- linux 命令 - 分区格式化命令 mkfs
- linux命令 - 磁盘分区命令 fdisk 和 parted
- Linux 基础二之基础命令及其参与选项
- LINUX下解决看电影的问题。
- Linux系统下运用开源RXTX库实现JAVA串口通讯
- Linux中点命令
- chown命令 - linux