제출 #1260926

#제출 시각아이디문제언어결과실행 시간메모리
1260926Szymon_PilipczukTourism (JOI23_tourism)C++20
0 / 100
5087 ms6684 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define st first #define nd second #define pb push_back #define all(a) a.begin(),a.end() #define rep(a,b) for(int a = 0;a<b;a++) const int inf = 1e9; const ll infl = 1e18; bool vis[100000]; vector<int> gr[100000]; int jp[20][100000]; int pr[100000]; int rpr[100000]; int d[100000]; int cpr = 0; void dfs(int v,int cd) { pr[v] = cpr; d[v] = cd; rpr[cpr] = v; cpr++; vis[v] = true; for(int i : gr[v]) { if(!vis[i]) { dfs(i,cd+1); jp[0][i] = v; } } } int lca(int a,int b) { if(d[a] < d[b]) { swap(a,b); } for(int i = 19;i>=0;i--) { if(d[a] - (1<<i) >= d[b]) { a = jp[i][a]; } } if(a==b)return a; for(int i = 19;i>=0;i--) { if(jp[i][a] != jp[i][b]) { a = jp[i][a]; b = jp[i][b]; } } return jp[0][a]; } int c[100000]; int main() { int n,m,q; cin>>n>>m>>q; rep(i,n-1) { int a,b; cin>>a>>b; a--;b--; gr[a].pb(b); gr[b].pb(a); } rep(i,m) { cin>>c[i]; c[i]--; } jp[0][0] = 0; dfs(0,0); rep(qq,q) { int ans = 0; int l,r; cin>>l>>r; l--;r--; vector<int> cc; for(int i = l;i<=r;i++) { cc.pb(pr[c[i]]); } sort(all(cc)); int plca = rpr[cc[0]]; for(int i = 1;i<cc.size();i++) { ans += d[rpr[cc[i]]] - d[lca(rpr[cc[i]],rpr[cc[i-1]])]; ans += d[plca] - d[lca(rpr[cc[i]],plca)]; plca = lca(rpr[cc[i]],plca); } cout<<ans+1<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...