社区讨论

同一道题 LOJ 50pts 但是 LG 0pts

P2825[HEOI2016/TJOI2016] 游戏参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo2l4xn3
此快照首次捕获于
2023/10/23 15:37
2 年前
此快照最后确认于
2023/10/23 15:37
2 年前
查看原帖
rtrt
C
#include <bits/stdc++.h>
#define MP make_pair
using namespace std;
const int maxn = 205;
int n, m, x, y, ans;
bool vis[maxn * maxn];
pair <int, int> l[maxn];
vector <int> pp[maxn * maxn];
int mp[maxn][maxn], d[maxn * maxn];
int changeon(const int x, const int y) {
   return (x - 1) * (m + 1) + y;
}
pair <int, int> changeoff (const int t) {
   int x = (t - 1) / (m + 1) + 1;
   int y = t - (x - 1) * (m + 1);
   return MP (x, y);
}
bool check (int x) {
   int i, y, k = pp[x].size();
   for (i = 0; i < k; ++i) {
   	y = pp[x][i];
   	if (!vis[y]) {
   		vis[y] = 1;
   		if (!d[y] || check (d[y])) {
   			d[y] = x;
   			return 1;
   		}
   	}
   }
   return 0;
}
signed main () {
   scanf("%d %d", &n, &m);
   for (int i = 1; i <= n; ++i) {
       string a;
       cin >> a;
   	for (int j = 0; j < m; ++j) {
           if (a[j] == '*') mp[i][j] = 0;
           else if (a[j] == 'x') mp[i][j]  =1;
           else mp[i][j] = 2;
   	}
   }
   for (int i = 0; i <= n + 1; ++i) mp[i][0] = mp[i][m + 1] = 2;
   for (int i = 0; i <= m + 1; ++i) mp[0][i] = mp[n + 1][i] = 2;
   for (int i = 1; i <= n; ++i) {
   	for (int j = 1; j <= m; ++j) {
   		if (mp[i][j]) continue;
   		y = j + 1;;
   		while (mp[i][y] != 2) ++y;
   		x = i + 1;
   		while (mp[x][j] != 2) ++x;
           pp[changeon(i, y)].push_back(changeon(x, j));
   	}
   }
   for (int i = 1; i <= n; ++i) {
   	for (int j = 1; j <= m; ++j) {
   		if (mp[i][j + 1] == 2) {
   			memset(vis, 0, sizeof (vis));
   			if (check(changeon(i, j + 1))) ++ans;
   		}
   	}
   }
   printf("%d\n", ans);
   return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...