Đề bài: http://vn.spoj.com/problems/NKGOLF/
Thuật toán:
- (đang cập nhập)
Code:
#include <iostream> #include <cstdio> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <map> #include <set> #include <vector> #include <stack> #include <deque> #include <queue> #include <utility> #include <sstream> using namespace std; #define FOR(i,a,b) for(int i = (a); i <= (b); i++) #define DOW(i,a,b) for(int i = (a); i >= (b); i--) #define RESET(c,val) memset(c,val,sizeof(c)) #define sz(a) int(a.size()) #define pb push_back typedef long long ll; typedef unsigned long long ull; /*---------------------------*/ const int maxn = 1e3 + 2; int m, n, res, tt; ll a[maxn][maxn]; bool b[maxn][maxn]; void input() { scanf("%d %d", &m, &n); RESET(a,0); FOR(i,1,m) FOR(j,1,n) scanf("%lld", &a[i][j]); } void solve() { FOR(i,1,m-1) FOR(j,1,n-1) b[i][j]=((a[i][j]<=a[i+1][j]) && (a[i][j]<=a[i][j+1]) && (a[i+1][j]<=a[i+1][j+1]) && (a[i][j+1]<=a[i+1][j+1])); res=1; // search row FOR(i,1,m) { tt=1; FOR(j,2,n) if ( a[i][j]>=a[i][j-1] ) { tt++; res=max(res,tt); } else tt=1; } // search col FOR(j,1,n) { tt=1; FOR(i,2,m) if ( a[i][j]>=a[i-1][j] ) { tt++; res=max(res,tt); } else tt=1; } int h[maxn], l[maxn], r[maxn]; RESET(h,0); RESET(l,0); RESET(r,0); FOR(i,1,m-1) { FOR(j,1,n-1) if ( b[i][j] ) h[j]++; else h[j]=0; //deque int d[maxn]; int top=0; d[0]=0; FOR(j,1,n-1) { while(top && h[j]<=h[d[top]]) r[d[top--]]=j-1; l[j]=d[top]+1; d[++top]=j; } while(top) r[d[top--]]=n-1; FOR(j,1,n-1) if ( h[j]>0 ) { res=max(res,(h[j]+1)*(r[j]-l[j]+2)); } } } void output() { printf("%d", res); } int main() { input(); solve(); output(); return 0; } |
Speak Your Mind