/* I will wait for you */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <string>
#define make make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int maxn = 710;
const int maxm = 61;
const int maxs = 26;
const int inf = 0x3f3f3f3f;
const int P = 1000000007;
const double error = 1e-9;
inline ll read() {
ll x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
int ans,del[maxn][maxn], hi[maxn][maxn], f[maxn][maxn];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
void dfs(int x, int y) {
if (f[x][y] == -1)
{
f[x][y] = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(del[nx][ny] != -1 && hi[x][y] > hi[nx][ny]) {
dfs(nx,ny);
f[x][y] = max(f[x][y], f[nx][ny]);
}
}
f[x][y]++;
}
ans = max(ans, f[x][y]);
}
int main() {
memset(del, -1, sizeof del);
int n = read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
hi[i][j] = read(), del[i][j] = 0;
int m = read();
while (m--) {
char s[10]; scanf("%s", s);
if (s[0] == 'C') {
int a = read(), b = read(), c = read();
hi[a][b] = c;
}
if (s[0] == 'S') {
int a = read(), b = read();
int c = read(), d = read();
for (int i = a; i <= c; i++)
for (int j = b; j <= d; j++)
del[i][j] = -1;
}
if (s[0] == 'B') {
int a = read(), b = read();
int c = read(), d = read();
for (int i = a; i <= c; i++)
for (int j = b; j <= d; j++)
del[i][j] = 0;
}
if (s[0] == 'Q') {
ans = -1;
memset(f, -1, sizeof f);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (f[i][j] == -1 && del[i][j] != -1)
dfs(i,j);
printf("%d\n", ans);
}
}
return 0;
}
BZOJ3207【暴力】
最新推荐文章于 2019-08-12 23:20:03 发布