社区讨论
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;
}
附逆天验证码:

回复
共 2 条回复,欢迎继续交流。
正在加载回复...