用了自己的土方法,在每次更新窗口时,只用更新一列或者一行,找中位数时,用的是个256的数组,加到sum>=m*n/2+1,就行了。一开始tle,后来发现没EOF ——! 代码如下: 第一次写这么稀疏的代码。。。 #include <stdio.h> #include <memory.h> #define SIZE 500 #define V 256 int map[SIZE][SIZE]; int mapp[SIZE][SIZE]; int d; int num[V]; int p,q,m,n; int x,y; void middle(int a, int b, int &c) { if(d==1) for(int i=0; i<m; ++i) { --num[map[a+i][b-1]]; ++num[map[a+i][b+n-1]]; } else if(d==2) for(int i=0; i<m; ++i) { --num[map[a+i][b+n]]; ++num[map[a+i][b]]; } else for(int i=0; i<n; ++i) { --num[map[a-1][b+i]]; ++num[map[a+m-1][b+i]]; } int cnt=0; for(int i=0; i<256; ++i) { cnt+=num[i]; if(cnt>=m*n/2+1) { c=i; break;} } } void output() { for(int i=0; i<p; ++i) { for(int j=0; j<q; ++j) { printf("%d",map[i][j]); if(j!=q-1) printf(" "); else printf("/n");} } printf("/n"); } void output2() { for(int i=0; i<p; ++i) { for(int j=0; j<q; ++j) { printf("%d",mapp[i][j]); if(j!=q-1) printf(" "); else printf("/n");} } printf("/n"); } void solve() { int x1,x2,y1,y2; x1=(m+1)/2-1; x2=p-(m-1)/2-1; y1=(n+1)/2-1; y2=q-(n-1)/2-1; x=x1; y=y1; if(x1>x2||y1>y2) { output(); return; } for(int i=x1-m/2; i<=x1+m/2; ++i) for(int j=y1-n/2; j<=y1+n/2; ++j) ++num[map[i][j]]; if(y1==y2) while(x<=x2) { int cnt=0; for(int i=0; i<256; ++i) { cnt+=num[i]; if(cnt>=m*n/2+1) {mapp[x][y]=i; break;} } ++x; while(x<=x2) { d=3; middle(x-m/2,y-n/2,mapp[x][y]); ++x; } } else { int cnt=0; for(int i=0; i<256; ++i) { cnt+=num[i]; if(cnt>=(m*n/2+1)) {mapp[x][y]=i; break;} } d=1; ++y; while(x<=x2) { middle(x-m/2,y-n/2,mapp[x][y]); if(d==1) { if(y==y2) { d=3; ++x; } else ++y; } else if(d==2) { if(y==y1) { d=3; ++x; } else --y; } else { if(y==y1) { d=1; ++y; } else { d=2; --y; } } } } output2(); return; } int main() { while(scanf("%d%d",&p,&q)!=EOF) { memset(num,0,sizeof(num)); for(int i=0; i<p; ++i) for(int j=0; j<q; ++j) { scanf("%d",&map[i][j]); mapp[i][j]=map[i][j];} scanf("%d%d",&m,&n); solve(); } }