Ejemplo: cómo encontrar la suma de valores en la ruta en un árbol
#include #defineFOR(i, x, y)for(int i = x; i < y; i++)typedeflonglong ll;usingnamespace std;int n, m;
vector<int> graph[100001];int timer =1, tin[100001], tout[100001];int anc[100001][18];voiddfs(int node =1,int parent =0)
anc[node][0]= parent;for(int i =1; i <18&& anc[node][i -1]; i++)
anc[node][i]= anc[anc[node][i -1]][i -1];
tin[node]= timer++;for(int i : graph[node])if(i != parent)dfs(i, node);
tout[node]= timer;int bit[100001];voidupdate(int pos,int val)for(; pos <= n; pos +=(pos &(-pos))) bit[pos]+= val;intquery(int pos)int ans =0;for(; pos; pos -=(pos &(-pos))) ans += bit[pos];return ans;intfind_ancestor(int node)int lca = node;for(int i =17;~i; i--)if(anc[lca][i]&&query(tin[anc[lca][i]])==query(tin[node])) lca = anc[lca][i];return lca;intmain()
ios_base::sync_with_stdio(0);
cin.tie(0);freopen("disconnect.in","r",stdin);freopen("disconnect.out","w",stdout);
cin >> n >> m;FOR(i,1, n)int a, b;
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);dfs();int v =0;while(m--)int t, x, y;
cin >> t >> x >> y;int a = x ^ v, b = y ^ v;if(t ==1)if(anc[b][0]== a)swap(a, b);update(tin[a],1);update(tout[a],-1);elseif(find_ancestor(a)==find_ancestor(b))
cout <<"YESn";
v = a;else
cout <<"NOn";
v = b;return0;
Recuerda que te brindamos la opción de valorar este escrito si diste con el hallazgo.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)