CF-825 G.Tree Queries(DFS)
生活随笔
收集整理的這篇文章主要介紹了
CF-825 G.Tree Queries(DFS)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CF-825 G.Tree Queries(DFS)
題目鏈接
題意
一棵樹nnn個節(jié)點(初始為白色),兩種操作:
輸入ttt和zzz,其中ttt表示操作類型,x=(last+z)%n+1x = (last + z) \% n + 1x=(last+z)%n+1,lastlastlast初始為0,2號操作之后更新lastlastlast
默認第一個操作為1
思路
首先選擇第一個黑色節(jié)點為根節(jié)點生成一棵樹,并求出每個節(jié)點到根節(jié)點經(jīng)過的最小的編號作為每個點的初始答案a[i]a[i]a[i].
每次新增加一個黑色節(jié)點uuu,uuu的子節(jié)點的值不會改變,但是其他的點可能通過根節(jié)點到u點來得到更加小的答案,每次1操作之后記錄下根節(jié)點往下能到的最小的節(jié)點MINMINMIN,2操作的答案就是min(a[i],MIN)min(a[i], MIN)min(a[i],MIN)
#include <bits/stdc++.h> const int maxn = 1e6 + 5; using namespace std; vector<int> g[maxn]; int a[maxn]; void dfs(int u, int d) {a[u] = d;for (int i = 0; i < (int)g[u].size(); ++i) {int v = g[u][i];if (a[v]) continue;dfs(v, min(d, v));} } int main() {int n, q;scanf("%d %d", &n, &q);for (int i = 1; i < n; ++i) {int u, v;scanf("%d %d", &u, &v);g[u].push_back(v);g[v].push_back(u);}int last = 0, op, d;scanf("%d %d", &op, &d); d = (d + last) % n + 1;dfs(d, d);int tmp = d;while (--q) {scanf("%d %d", &op, &d);d = (d + last) % n + 1;if (op == 1) tmp = min(tmp, a[d]);else {last = min(tmp, a[d]);printf("%d\n", last);}}return 0; }總結(jié)
以上是生活随笔為你收集整理的CF-825 G.Tree Queries(DFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF-1207 G.Indie Albu
- 下一篇: CF-196 D.The Next Go