이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#define taskname "Factories"
#include <bits/stdc++.h>
#define int long long
#define ii pair<int,int>
#define ff first
#define ss second
using namespace std;
const int maxn = 5e5 + 10;
vector<ii> adj[maxn];
vector<int> dis[maxn];
int sz[maxn], pa[maxn], dp[maxn], ban[maxn], n, q;
void DFSz(int u, int p = -1)
{
sz[u] = 1;
for (auto [v, c]: adj[u]) if (v != p && !ban[v]) DFSz(v, u), sz[u] += sz[v];
}
int getcen(int u, int need, int p = -1)
{
if (sz[u] <= need) return p;
ii big = {0, 0};
for (auto [v, c]: adj[u]) if (v != p && !ban[v]) big = max(big, {sz[v], v});
return getcen(big.ss, need, u);
}
void DFS(int u, int des, int p, int dep)
{
dis[u].emplace_back(dep);
for (auto [v, c]: adj[u]) if (v != p && !ban[v]) DFS(v, des, u, dep+c);
}
void build(int u = 1, int p = 0)
{
DFSz(u);
u = getcen(u, sz[u]/2);
pa[u] = p;
// cerr<<"TREE: "<<p-1<<" "<<u-1<<"\n";
ban[u] = 1;
dp[u] = 1e18;
dis[u].emplace_back(0);
for (auto [v, c]: adj[u]) if (!ban[v])
{
DFS(v, u, u, c);
build(v, u);
}
}
inline void upd(int pos)
{
int u = pos;
for (int i=(int)dis[u].size()-1; i>=0; i--)
{
int j = dis[u][i];
// cerr<<i<<" "<<j<<"\n";
dp[pos] = min(dp[pos], j);
pos = pa[pos];
}
}
inline int qry(int pos)
{
int u = pos;
int ans = 1e18;
for (int i=(int)dis[u].size()-1; i>=0; i--)
{
int j = dis[u][i];
ans = min(ans, dp[pos] + j);
pos = pa[pos];
}
return ans;
}
inline void rollback(int pos) {
int u = pos;
for (int i=(int)dis[u].size()-1; i>=0; i--)
{
int j = dis[u][i];
// cerr<<i<<" "<<j<<"\n";
dp[pos] = 1e18;
pos = pa[pos];
}
}
void Init(int32_t N, int32_t a[], int32_t b[], int32_t d[])
{
for (int i=0; i<=N-2; i++)
{
int u = a[i]+1, v = b[i]+1, c = d[i];
// cerr<<u<<" "<<v<<" "<<c<<"\n";
adj[u].emplace_back(v, c);
adj[v].emplace_back(u, c);
}
build();
// for (int i=1; i<=N; i++) cerr<<"WEIRD: "<<i<<" "<<dis[i].size()<<"\n";
}
int Query(int32_t s, int32_t x[], int32_t t, int32_t y[])
{
// if (s > t)
// {
// swap(s, t);
// swap(x, y);
// }
for (int i=0; i<s; i++) upd(x[i]+1);
int ans = 1e18;
for (int i=0; i<t; i++) ans = min(ans, qry(y[i]+1));
for (int i=0; i<s; i++) rollback(x[i]+1);
return ans;
}
//signed main()
//{
// ios_base::sync_with_stdio(false);
// cin.tie(nullptr); cout.tie(nullptr);
// int32_t a[] = {0, 1, 2, 2, 4, 1}, b[] = {1, 2, 3, 4, 5, 6}, d[] = {4, 4, 5, 6, 5, 3};
// Init(7, a, b, d);
// {
// int32_t q1[] = {0, 6}, q2[] = {3, 4};
// cout<<Query(2, q1, 2, q2)<<"\n"; //returns 12.
// }
// {
// int32_t q1[] = {0, 1, 3}, q2[] = {4, 6};
// cout<<Query(3, q1, 2, q2)<<"\n"; //returns 3.
// }
// {
// int32_t q1[] = {2}, q2[] = {5};
// cout<<Query(1, q1, 1, q2)<<"\n"; //returns 11.
// }
//}
컴파일 시 표준 에러 (stderr) 메시지
factories.cpp: In function 'void rollback(long long int)':
factories.cpp:79:13: warning: unused variable 'j' [-Wunused-variable]
79 | int j = dis[u][i];
| ^| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |