2015-01-25 00:59:14
思路:解法1:可以暴力预处理出每个点的答案...(当然维护一个正方形框可以优化这个过程)...
解法2:建立二维线段树,然后查询...
解法3.... ?
解法1:
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <stack> 9 #include <queue> 10 #include <string> 11 #include <iostream> 12 #include <algorithm> 13 using namespace std; 14 15 #define MEM(a,b) memset(a,b,sizeof(a)) 16 #define REP(i,n) for(int i=1;i<=(n);++i) 17 #define REV(i,n) for(int i=(n);i>=1;--i) 18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) 20 #define MP(a,b) make_pair(a,b) 21 22 typedef long long ll; 23 typedef pair<int,int> pii; 24 const int INF = (1 << 30) - 1; 25 const int maxn = 300; 26 27 int N,B,K; 28 int g[maxn][maxn]; 29 int cnt[maxn],tmp[maxn],ans[maxn][maxn]; 30 31 int Solve(){ 32 int tmax = -1,tmin = -1; 33 FOR(i,0,250) if(cnt[i]){ 34 tmin = i; 35 break; 36 } 37 RFOR(i,250,0) if(cnt[i]){ 38 tmax = i; 39 break; 40 } 41 return tmax - tmin; 42 } 43 44 int main(){ 45 while(scanf("%d%d%d",&N,&B,&K) != EOF){ 46 REP(i,N) REP(j,N){ 47 scanf("%d",&g[i][j]); 48 } 49 MEM(cnt,0); 50 REP(i,B) REP(j,B) 51 cnt[g[i][j]]++; 52 REP(i,N - B + 1){ 53 if(i > 1){ 54 REP(k,B) cnt[g[i - 1][k]]--; 55 REP(k,B) cnt[g[i + B - 1][k]]++; 56 } 57 memcpy(tmp,cnt,sizeof(tmp)); 58 ans[i][1] = Solve(); 59 FOR(j,2,N - B + 1){ 60 REP(k,B) cnt[g[i + k - 1][j - 1]]--; 61 REP(k,B) cnt[g[i + k - 1][j + B - 1]]++; 62 ans[i][j] = Solve(); 63 } 64 memcpy(cnt,tmp,sizeof(tmp)); 65 } 66 int a,b; 67 REP(i,K){ 68 scanf("%d%d",&a,&b); 69 printf("%d\n",ans[a][b]); 70 } 71 } 72 return 0; 73 }