您的位置:首页 > 其它

[luoguP1169] [ZJOI2007]棋盘制作(单调栈)

2017-05-06 21:32 267 查看

传送门

 

玉蟾宫差不多

——代码

#include <cstdio>
#include <iostream>

using namespace std;

const int MAXN = 2001;
int n, m, ans1, ans2, top;
int a[MAXN][MAXN][2], s[MAXN], r[MAXN], l[MAXN];

inline void work(int k)
{
int i, j;
for(i = 0; i <= 1; i++)
{
a[k][0][i] = a[k][m + 1][i] = -1;
top = 0;
for(j = 1; j <= m + 1; j++)
{
while(top && a[k][s[top]][i] > a[k][j][i]) r[s[top--]] = j;
s[++top] = j;
}
top = 0;
for(j = m; j >= 0; j--)
{
while(top && a[k][s[top]][i] > a[k][j][i]) l[s[top--]] = j;
s[++top] = j;
}
for(j = 1; j <= m; j++)
{
ans1 = max(ans1, min(a[k][j][i], r[j] - l[j] - 1) * min(a[k][j][i], r[j] - l[j] - 1));
ans2 = max(ans2, a[k][j][i] * (r[j] - l[j] - 1));
}
}
}

int main()
{
int i, j, x;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
{
scanf("%d", &x);
if((i + j) % 2) x ^= 1;
a[i][j][x] = a[i - 1][j][x] + 1;
}
for(i = 1; i <= n; i++) work(i);
printf("%d\n%d\n", ans1, ans2);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: