QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#877522 | #5492. Toll Roads | gustavoleal | RE | 0ms | 0kb | C++14 | 2.8kb | 2025-01-31 23:01:41 | 2025-01-31 23:01:41 |
answer
#include<bits/stdc++.h>
using namespace std;
const int N = 200100;
const int K = 22;
int pai[N][K], mx[N][K], in[N], out[N], tt = 0;
vector<pair<int,int>> adj[N];
int uf_pai[N], sz[N];
int findx(int x)
{
if(x == uf_pai[x])
return x;
return uf_pai[x] = findx(uf_pai[x]);
}
void dfs(int u, int p, int c)
{
in[u] = tt++;
pai[u][0] = p;
mx[u][0] = c;
for(int i = 1; i < K; i++)
{
pai[u][i] = pai[pai[u][i-1]][i-1];
mx[u][i] = max(mx[u][i-1],mx[pai[u][i-1]][i-1]);
}
for(auto [v,cc]:adj[u])
{
if(v != p)
dfs(v,u,cc);
}
out[u] = tt++;
}
// ask if u is parent from v
bool is_parent(int u, int v)
{
return in[u] <= in[v] && out[u] >= out[v];
}
int calc_max(int u, int v)
{
int ans = 0;
for(int i = K-1; i >= 0; i--)
{
if(!is_parent(pai[u][i],v))
{
ans = max(ans, mx[u][i]);
u = pai[u][i];
}
if(!is_parent(pai[v][i],u))
{
ans = max(ans, mx[v][i]);
v = pai[v][i];
}
}
if(!is_parent(u,v))
ans = max(ans,mx[u][0]);
if(!is_parent(v,u))
ans = max(ans,mx[v][0]);
return ans;
}
vector<pair<int,pair<int,int>>> edges;
vector<pair<int,int>> queries;
int r1[N], r2[N];
vector<int> temp[N];
int main()
{
int n, m;
cin >> n >> m;
int q;
cin >> q;
for(int i = 0; i < m; i++)
{
int u, v, c;
cin >> u >> v >> c;
edges.emplace_back(c,pair<int,int>{u,v});
}
for(int i = 1; i <= n; i++)
uf_pai[i] = i;
sort(edges.begin(),edges.end());
for(auto [c,pp]:edges)
{
auto [u,v] = pp;
int ou = u, ov = v;
u = findx(u);
v = findx(v);
if(u != v)
{
uf_pai[u] = v;
adj[ou].emplace_back(ov,c);
adj[ov].emplace_back(ou,c);
}
}
dfs(1,1,0);
for(int i = 0; i < q; i++)
{
int u, v;
cin >> u >> v;
queries.emplace_back(u,v);
r1[i] = calc_max(u,v);
temp[r1[i]].push_back(i);
}
for(int i = 1; i <= n; i++){
uf_pai[i] = i;
sz[i] = 1;
}
int last = -1;
for(auto [c,pp]:edges)
{
if(c != last)
{
for(auto x:temp[last])
r2[x] = sz[findx(queries[x].first)];
last = c;
}
auto [u,v] = pp;
u = findx(u);
v = findx(v);
if(u != v)
{
uf_pai[u] = v;
sz[v] += sz[u];
}
}
for(auto x:temp[last])
r2[x] = sz[findx(queries[x].first)];
for(int i = 0; i < q; i++)
cout << r1[i] << ' ' << r2[i] << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
4 3 6 1 2 1 2 3 3 3 4 2 1 2 1 3 1 4 2 3 2 4 3 4