悬赏一关注,为什么会编译错误,本地是正常的
查看原帖
悬赏一关注,为什么会编译错误,本地是正常的
661641
Cx114514楼主2024/7/17 12:17
#include <bits/stdc++.h>
#define int long long
using namespace std;

int dx[4] = {1, 0, 0, -1},
	dy[4] = {0, 1, -1, 0};

int n, m, Q, dis[155][20005], vis[20005], x1[100005], x2[100005], y1[100005], y2[100005], R[20005][5], ans[100005];

vector < int > v;

struct node
{
	int x, y, w;
	bool operator < (const node &a) const
	{
		return w > a.w;
	}
};

priority_queue < node > q;

int id(int x, int y)
{
	return (x - 1) * m + y;
}

void dijkstra1(int x, int y, int l, int r)
{
	for (int i = 1; i <= n; i++)
		for (int j = l; j <= r; j++)
			dis[x][id(i, j)] = 1145141919;
	for (int i = 1; i <= n; i++)
		for (int j = l; j <= r; j++)
			vis[id(i, j)] = 0;
	dis[x][id(x, y)] = 0;
	q.push({x, y, 0});
	while (!q.empty())
	{
		node t = q.top();
		q.pop();
		if (vis[id(t.x, t.y)]) continue;
		vis[id(t.x, t.y)] = 1;
		for (int i = 0; i < 4; i++)
		{
			int tx = t.x + dx[i], ty = t.y + dy[i];
			if (tx > 0 && tx <= n && ty >= l && ty <= r)
			{
				if (dis[x][id(tx, ty)] > dis[x][id(t.x, t.y)] + R[id(t.x, t.y)][i])
				{
					dis[x][id(tx, ty)] = dis[x][id(t.x, t.y)] + R[id(t.x, t.y)][i];
					q.push({tx, ty, dis[x][id(tx, ty)]});
				}
			}
		}
	}
}

void dijkstra2(int x, int y, int l, int r)
{
	for (int i = l; i <= r; i++)
		for (int j = 1; j <= m; j++)
			dis[y][id(i, j)] = 1145141919;
	for (int i = l; i <= r; i++)
		for (int j = 1; j <= m; j++)
			vis[id(i, j)] = 0;
	dis[y][id(x, y)] = 0;
	q.push({x, y, 0});
	while (!q.empty())
	{
		node t = q.top();
		q.pop();
		if (vis[id(t.x, t.y)]) continue;
		vis[id(t.x, t.y)] = 1;
		for (int i = 0; i < 4; i++)
		{
			int tx = t.x + dx[i], ty = t.y + dy[i];
			if (tx >= l && tx <= r && ty > 0 && ty <= m)
			{
				if (dis[y][id(tx, ty)] > dis[y][id(t.x, t.y)] + R[id(t.x, t.y)][i])
				{
					dis[y][id(tx, ty)] = dis[y][id(t.x, t.y)] + R[id(t.x, t.y)][i];
					q.push({tx, ty, dis[y][id(tx, ty)]});
				}
			}
		}
	}
}

void doit1(vector < int > fac, int l, int r)
{
	if (l > r) return;
	if (!fac.size()) return;
	int mid = (l + r) / 2;
	for (int i = 1; i <= n; i++)
		dijkstra1(i, mid, l, r);
	vector < int > facl, facr;
	for (int i = 0; i < fac.size(); i++)
	{
		int t = fac[i];
		for (int j = 1; j <= n; j++)
			ans[t] = min(ans[t], dis[j][id(x1[t], y1[t])] + dis[j][id(x2[t], y2[t])]);
		if (y1[t] <= mid && y2[t] <= mid) facl.push_back(t);
		else if (y1[t] > mid && y2[t] > mid) facr.push_back(t);
	}
	doit1(facl, l, mid);
	doit1(facr, mid + 1, r);
}

void doit2(vector < int > fac, int l, int r)
{
	if (l > r) return;
	if (!fac.size()) return;
	int mid = (l + r) / 2;
	for (int i = 1; i <= m; i++)
		dijkstra2(mid, i, l, r);
	vector < int > facl, facr;
	for (int i = 0; i < fac.size(); i++)
	{
		int t = fac[i];
		for (int j = 1; j <= m; j++)
			ans[t] = min(ans[t], dis[j][id(x1[t], y1[t])] + dis[j][id(x2[t], y2[t])]);
		if (x1[t] <= mid && x2[t] <= mid) facl.push_back(t);
		else if (x1[t] > mid && x2[t] > mid) facr.push_back(t);
	}
	doit2(facl, l, mid);
	doit2(facr, mid + 1, r);
}

signed main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j < m; j++)
		{
			cin >> R[id(i, j)][1];
			R[id(i, j + 1)][2] = R[id(i, j)][1];
		}
	for (int i = 1; i < n; i++)
		for (int j = 1; j <= m; j++)
		{
			cin >> R[id(i, j)][0];
			R[id(i + 1, j)][3] = R[id(i, j)][0];
		}
	cin >> Q;
	for (int i = 1; i <= Q; i++)
		ans[i] = 1145141919;
	for (int i = 1; i <= Q; i++)
		cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
	for (int i = 1; i <= Q; i++)
		v.push_back(i);
	if (n < m) doit1(v, 1, m);
	else doit2(v, 1, n);
	for (int i = 1; i <= Q; i++)
		cout << ans[i] << endl; 
    return 0;
}


2024/7/17 12:17
加载中...