HDU6162 Ch’s gift【LCA】
사고: 처음에 T 는 양 방향 BFS 를 시 작 했 는데 나중에 LCA 라 는 알고리즘 이 생각 났 습 니 다. 안 타 깝 게 도 배 운 적 이 없습니다. 현장 학 은 템 플 릿 을 잘못 사 용 했 습 니 다. 이분 검색 으로 LCA 의 템 플 릿 을 찾 았 습 니 다.나 는 매번 새로 도착 한 점 의 권 (범위 내) 을 더 하고 이 점 을 2 점 으로 나 누 며 갱신 하 는 점 은 뛰 어 다 닌 다.한 걸음 한 걸음 위로 올 라 가 야 할 틀 로 경기 후에 야 생각 했 는데 이미 늦 었 다.
점 마다 깊이 가 있 습 니 다. 두 점 의 LCA 를 찾 을 때 여러분 은 먼저 한 깊이 로 가서 같이 위로 올 라 갑 니 다.
#include
using namespace std;
const int MAX_V = 2e5+5;
const int MAX_LOG_V = 100;
vector G[MAX_V];
int root;
int parent[MAX_V];
int dep[MAX_V];
long long ans;
long long cc[MAX_V],aa[MAX_V];
void dfs(int v,int p,int d)
{
parent[v]=p;
dep[v]=d;
for(int i=0;i= c && aa[x] <= d)
return aa[x];
else
return 0;
}
int lca(int u,int v,int c,int d)
{
ans += is(u,c,d);
ans += is(v,c,d);
while(dep[u] > dep[v])
{
u = parent[u];
ans += is(u,c,d);
}
while(dep[v] > dep[u])
{
v = parent[v];
ans += is(v,c,d);
}
while(u != v)
{
u = parent[u];
ans += is(u,c,d);
v = parent[v];
ans += is(v,c,d);
}
ans -= is(v,c,d);
return u;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i = 0; i <= n; i++)
G[i].clear();
root = n / 2;
for(int i = 0; i < n; i++)
scanf("%lld",&aa[i]);
for(int i = 1; i < n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
a--;b--;
G[a].push_back(b);
G[b].push_back(a);
}
init(n);
for(int i = 1; i <= m; i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--;b--;
ans = 0;
lca(a,b,c,d);
cc[i] = ans;
}
for(int i = 1; i <= m; i++)
printf("%lld%c",cc[i],i==m?'
':' ');
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
2019 우 객 여름 다 교 훈련소 (제10 회) F: Popping BalloonsPopping Balloons 제목: 가로 선 3 개, 세로 선 3 개 를 선택 하고 인접 선 간 의 거 리 는 r 를 초과 하지 않 으 며 통과 할 수 있 는 최대 포 인 트 를 구하 십시오. 생각: 가로 선 하나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.