社区讨论

qt

P13823「Diligent-OI R2 C」所谓伊人参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjd7ick
此快照首次捕获于
2025/11/04 00:39
4 个月前
此快照最后确认于
2025/11/04 00:39
4 个月前
查看原帖
rt, qt WA: 5pts
CPP
#include <bits/extc++.h>
#define endl '\n'
typedef long long ll;
#define int ll
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;

struct lyy
{
	int n;
	vector<int> v, mx;
	lyy(const int _n, const vector<int>& a) : n(_n), v(_n, -1), mx(a)
	{
	}
	function<int(int)> find = [&](const int x) { return v[x] < 0 ? x : v[x] = find(v[x]); };
	void merge(int x, int y)
	{
		x = find(x);
		y = find(y);
		if (x == y)
		{
			return;
		}
		if (v[x] > v[y])
		{
			swap(x, y);
		}
		v[x] += v[y];
		v[y] = x;
		mx[x] = max(mx[x], mx[y]);
		mx[y] = 0;
	}
};

struct ly
{
	int v, nt, w;
};

int get(const int x, const int id)
{
	return ((x - 1) << 2 ^ id) + 1;
}

int unget(const int x, const int id)
{
	return ((x - 1 ^ id) >> 2) + 1;
}

#define sprt (get(n + 1, 0))

/*
 * 0:Cin  1:Rout <== In  part
 * 2:Rin  3:Cout <== Out part
 */

void Main()
{
	int n, m;
	cin >> n >> m;
	vector<int> he(n << 2 | 2), p(n + 1), ism(n + 1), dis(n << 2 | 2, 0x3f3f3f3f3f3f3f3f), vis(n << 2 | 2);
	vector<ly> edge(1);
	auto add = [&](const int u, const int v, const int w)
	{
		edge.push_back({v, he[u], w});
		he[u] = static_cast<int>(edge.size()) - 1;
	};
	for (int i = 1; i <= n; ++i)
	{
		add(get(i, 0), get(i, 3), 0);
		add(get(i, 1), get(i, 2), 0);
		add(get(i, 0), get(i, 2), 1);
		add(get(i, 1), get(i, 3), 1);
	}
	for (int& x : p | views::drop(1))
	{
		cin >> x;
	}
	lyy dsu(n + 1, p);
	for (int i = 1, u, v; i <= m; ++i)
	{
		cin >> u >> v;
		dsu.merge(u, v);
		add(get(u, 3), get(v, 0), 0);
		add(get(u, 2), get(v, 1), 0);
	}
	for (int i = 1; i <= n; ++i)
	{
		if (dsu.mx[dsu.find(i)] == p[i])
		{
			ism[i] = 1;
			add(sprt, get(i, 0), 1);
			add(sprt, get(i, 1), 1);
		}
	}
	auto dij = [&](int s)
	{
		__gnu_pbds::priority_queue<pair<int, int>, greater<>, thin_heap_tag> q;
		dis[s] = 0;
		q.push({0, s});
		while (!q.empty())
		{
			auto [d, u] = q.top();
			q.pop();
			if (vis[u])
			{
				continue;
			}
			vis[u] = 1;
			for (int i = he[u]; i; i = edge[i].nt)
			{
				if (int v = edge[i].v, w = edge[i].w; dis[v] > d + w)
				{
					dis[v] = d + w;
					q.push({dis[v], v});
				}
			}
		}
	};
	dij(sprt);
	for (int i = 1; i <= n; ++i)
	{
		cout << min(dis[get(i, 0)], dis[get(i, 1)]) - ism[i] << " ";
	}
	cout << endl;
}

// #define CP_MULTI_TEST_CASES

signed main()
{
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int t = 1;
#ifdef CP_MULTI_TEST_CASES
	cin >> t;
#endif
	while (t--)
	{
		Main();
	}
	return cout << flush, fflush(stdout), 0;
}
附逆天验证码: chnm

回复

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

正在加载回复...