社区讨论
WA60分求hack(简单一点的
P1514[NOIP 2010 提高组] 引水入城参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mllvt9jp
- 此快照首次捕获于
- 2026/02/14 13:34 5 天前
- 此快照最后确认于
- 2026/02/14 21:40 5 天前
代码:
CPP#include <bits/stdc++.h>
using namespace std;
#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;
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);
int left, right = 1;
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;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...