This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
const int maxn = 1e5;
const int maxlog = 16;
vector<pair<int,int>> g[maxn+2];
int sta[maxn+2] , fin[maxn+2] , timedfs = 0 , n;
int par[maxn+2][maxlog+2] , h[maxn+2] , v[maxn+2] ;
i64 d[maxn+2];
void dfs(int u , int p)
{
sta[u] = ++timedfs;
h[u] = h[p]+1;
par[u][0] = p;
for (int i = 1; i <= maxlog; ++i)
par[u][i] = par[par[u][i - 1]][i - 1];
for (auto& v : g[u])
if(v.first != p)
{
d[v.first] = d[u] + v.second;
dfs(v.first , u);
}
fin[u] = timedfs;
return;
}
int LCA(int u , int v)
{
if (h[u] < h[v]) swap(u,v);
for (int i = maxlog; i >= 0; --i)
if (h[par[u][i]] >= h[v])
u = par[u][i];
if (u==v) return u;
for (int i = maxlog; i >= 0; --i)
if (par[u][i]!=par[v][i])
u = par[u][i] , v = par[v][i];
return par[u][0];
}
bool parent(int u , int lca)
{
return sta[lca] <= sta[u] && sta[u] <= fin[lca];
}
bool cmp(int x , int y)
{
return sta[x] < sta[y];
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#define name "main"
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w+",stdout);
}
cin >> n;
for (int i = 1; i < n; ++i)
{
int u , v , w; cin >> u >> v >> w;
++u,++v;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dfs(1,0);
int q; cin >> q;
while(q--)
{
int numv = 5;
vector<int> vert;
for (int i = 1; i <= numv; ++i) {
cin >> v[i]; ++v[i];
vert.push_back(v[i]);
}
sort(v+1,v+numv+1,cmp);
for (int i = 2;i <= numv; ++i) vert.push_back(LCA(v[i],v[i-1]));
sort(vert.begin(),vert.end(),cmp); vert.resize(unique(vert.begin(),vert.end()) - vert.begin());
vector<int> lis;
i64 answer = 0;
lis.push_back(vert[0]);
for (int i = 1; i < vert.size(); ++i)
{
while (lis.size() && !parent(vert[i],lis.back())) lis.pop_back();
if (lis.size())
{
// cout << lis.back() << ' ' << vert[i] << '\n';
answer += d[vert[i]] - d[lis.back()];
}
lis.push_back(vert[i]);
}
cout << answer << '\n';
}
}
Compilation message (stderr)
roadsideadverts.cpp: In function 'int main()':
roadsideadverts.cpp:84:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
84 | for (int i = 1; i < vert.size(); ++i)
| ~~^~~~~~~~~~~~~
roadsideadverts.cpp:57:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
57 | freopen(name".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
roadsideadverts.cpp:58:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
58 | freopen(name".out","w+",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |