Cornfields
Time Limit: | Memory Limit: | |
Total Submissions:8623 | Accepted: |
Description
Input
Output
Sample Input
5 3 1 5 1 2 6 3 1 3 5 2 7 7 2 4 6 1 9 9 8 6 5 0 6 9 3 9 1 2
Sample Output
5C++代码


1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <set> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <set> 10 #include <math.h> 11 #include <algorithm> 12 using namespace std; 13 #define MAXN 250 + 5 14 int dp[MAXN][MAXN][20]; 15 int dp1[MAXN][MAXN][20]; 16 int a[MAXN][MAXN]; 17 int n,m; 18 void st(){ 19 for(int i=1;i<=n;i++) 20 for(int k=0;(1<<k)<=m;k++){ 21 for(int j=1;j+(1<<k)-1<=m;j++){ 22 if(k==0){ 23 dp[i][j][k]=dp1[i][j][k]=a[i][j]; 24 } 25 else { 26 dp[i][j][k]=max(dp[i][j][k-1],dp[i][j+(1<<(k-1))][k-1]); 27 dp1[i][j][k]=min(dp1[i][j][k-1],dp1[i][j+(1<<(k-1))][k-1]); 28 } 29 } 30 } 31 } 32 int rmq2dmax(int x,int y,int x1,int y1){ 33 int k=log2(y1-y+1); 34 int mm=max(dp[x][y][k],dp[x][y1-(1<<k)+1][k]); 35 for(int i=x+1;i<=x1;i++) 36 mm=max(mm,max(dp[i][y][k],dp[i][y1-(1<<k)+1][k])); 37 return mm; 38 } 39 int rmq2dmin(int x,int y,int x1,int y1){ 40 int k=log2(y1-y+1); 41 int mm=min(dp1[x][y][k],dp1[x][y1-(1<<k)+1][k]); 42 for(int i=x+1;i<=x1;i++) 43 mm=min(mm,min(dp1[i][y][k],dp1[i][y1-(1<<k)+1][k])); 44 return mm; 45 } 46 47 48 int main(int argc, char const *argv[]) 49 { 50 int b,k; 51 scanf("%d%d%d",&n,&b,&k); 52 m = n; 53 for(int i = 1;i <= n; i++){ 54 for(int j = 1;j <= n ; j++){ 55 scanf("%d",&a[i][j]); 56 } 57 } 58 st(); 59 while(k--){ 60 int p,q; 61 scanf("%d%d",&p,&q); 62 cout << rmq2dmax(p,q,p + b - 1,q + b - 1) - rmq2dmin(p,q,p + b - 1,q + b - 1)<< endl; 63 } 64 return 0; 65 }