日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF-825 G.Tree Queries(DFS)

發(fā)布時間:2024/4/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF-825 G.Tree Queries(DFS) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CF-825 G.Tree Queries(DFS)

題目鏈接

題意

一棵樹nnn個節(jié)點(初始為白色),兩種操作:

  • 1 xxx 把節(jié)點xxx設置為黑色
  • 2 xxx 求節(jié)點xxx到任意一個黑色節(jié)點的簡單路徑上的最小編號的節(jié)點
  • 輸入tttzzz,其中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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。