98极限求调!!!玄关
查看原帖
98极限求调!!!玄关
1054952
zzCX_df楼主2024/12/27 20:04
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 510, M = 310000, D[2][2] = {{1, -1}, {1, 1}};
const char c[2] = {'/', '\\'};
int T, n, m, dist[M];
char s[N][N];
bool b[M];
vector<pair<int, int>> edges[M];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;

inline void add(int u, int v, bool w) {
	edges[u].push_back(make_pair(w, v));
	edges[v].push_back(make_pair(w, u));
}

inline void build() {
	if (s[1][m] == '/')
		add(m + 1, 2 * m - 1, 0);
	else
		add(m + 1, 2 * m - 1, 1);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			for (int k = 0; k < 2; k++) {
				int x = i + D[k][0], y = j + D[k][1];
				if (x < 1 || x > n + 1 || y < 1 || y > m + 1)
					continue;
				int sum0 = (i - 1) * (m + 1) + j, sum1 = (x - 1) * (m + 1) + y;
				// if (sum0 == 4 && sum1 == 9) {
				//     printf("%d %d\n%d %d %d\n\n\n\n\n\n", i, j, x, y, k);
				// }
				if (s[i][j - (k ^ 1)] == c[k])
					add(sum0, sum1, 0);
				else
					add(sum0, sum1, 1);
			}
}

inline void dijkstra() {
	memset(b, false, sizeof(b));
	memset(dist, 127, sizeof(dist));
	dist[1] = 0;
	q.push(make_pair(0, 1));
	while (!q.empty()) {
		pair<int, int> x;
		x = q.top();
		q.pop();
		if (b[x.second]) continue;
		b[x.second] = true;
		for (int i = 0; i < (int)edges[x.second].size(); i++) {
			int v = edges[x.second][i].second;
			int w = edges[x.second][i].first;
			if (dist[v] > w + dist[x.second] + 0LL)
				dist[v] = w + dist[x.second];
			q.push(make_pair(dist[v], v));
		}
	}
	for (int i = 1; i <= (n + 1) * (m + 1); i++)
		while (!edges[i].empty())
			edges[i].pop_back();
}

signed main() {
	scanf("%lld%lld", &n, &m);
	if ((n + m) & 1) {
		puts("NO SOLUTION");
		return 0;
	}
	for (int i = 1; i <= n; i++) {
		scanf("%s", s[i] + 1);
		getchar();
	}
	build();
	for (int i = 1; i <= (n + 1); i++)
	    for (int j = 1; j <= (m + 1); j++) {
	        int sum = (i - 1) * (m + 1) + j;
	        for (auto y : edges[sum])
	            printf("%lld %lld %lld\n", sum, y.second, y.first);
	        puts("");
	    }
	dijkstra();
	printf("%lld\n", dist[(n + 1) * (m + 1)]);
	return 0;
}
2024/12/27 20:04
加载中...