社区讨论
为什么CE
学术版参与者 5已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mllwrdpu
- 此快照首次捕获于
- 2026/02/14 14:00 5 天前
- 此快照最后确认于
- 2026/02/17 18:45 前天
如果把下面代码的全局变量left和right放入main函数中,为什么就不会CE了
CPP#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3, "Ofast", "inline")
#define int long long
// #define int __int128
// #define int unsigned long long
const int N = 510, M = 510;
struct interval {
int l, r;
} dp[M]; // 写法是贪心不是dp
int a[N][M];
bool vis[N][M];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int n, m, ans, left, right;
bool check (int x, int y) {
if (x >= 1 && x <= n && y >= 1 && y <= m && !vis[x][y]) return true;
return false; // else
}
void dfs (int x, int y) {
if (vis[x][y]) return;
vis[x][y] = true;
for (int i = 0; i < 4; i++) {
int fx = x + dx[i], fy = y + dy[i];
if (check (fx, fy) && a[x][y] > a[fx][fy]) {
dfs (fx, fy);
}
}
}
void dfs1 (int j, int x, int y) {
if (vis[x][y]) return;
vis[x][y] = true;
for (int i = 0; i < 4; i++) {
int fx = x + dx[i], fy = y + dy[i];
if (check (fx, fy) && a[x][y] > a[fx][fy]) {
dfs1 (j, fx, fy);
}
}
if (x == n) {
dp[j].l = min ({dp[j].l, y});
dp[j].r = max ({dp[j].r, y});
return;
}
}
bool cmp (interval x, interval y) {
if (x.l == y.l) return x.r > y.r;
return x.l < y.l;
}
signed main () {
ios::sync_with_stdio (false);
cin.tie (0), cout.tie (0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
for (int j = 1; j <= m; j++) {
dfs (1, j);
}
bool f = true;
for (int j = 1; j <= m; j++) {
if (!vis[n][j]) {
f = false;
++ ans;
}
}
if (!f) {
cout << "0" << "\n";
cout << ans << "\n";
return 0;
}
for (int j = 1; j <= m; j++) {
memset (vis, 0, sizeof vis);
dp[j] = {INT_MAX, INT_MIN};
dfs1 (j, 1, j);
}
sort (dp + 1, dp + 1 + m, cmp);
left = 0, right = 0;
for (int j = 1; j <= m; j++) {
if (dp[j].l <= right + 1 && dp[j].r >= right + 1) { // 左端点在上一个右端点之内,合法
left = dp[j].l;
right = dp[j].r;
++ ans;
}
}
cout << "1" << "\n";
cout << ans << "\n";
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...