社区讨论

为什么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 条回复,欢迎继续交流。

正在加载回复...