Educational Codeforces Round 25 G. Tree Queries

题目链接
大意:给你一颗树和一些操作(初始所有节点都是白***r> 1:把 v v v点染成黑***r> 2:找到一个最小节点编号 y y y,使得 x x x到某个黑色节点到最短路径上存在节点 y y y.

思路:我们把第一个变成黑色节点到点 设为根节点,然后求出根节点到所有点的路径上到最小节点编号,设为数组 f f f,那么如果没有其他黑点的话,那么 f [ x ] f[x] f[x]就是询问点 x x x的答案了。如果存在别的黑点 x x x,那么显然 x x x到根节点的路径上的所有点 ,其他的点都可以到达,更新一下可能到全局最小值 m i n min min m i n , f [ x ] min,f[x] min,f[x]两者取一个最小值即可。
细节见代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
#define fi first
#define se second
#define pb push_back
vector<int> v[N];
int ans[N],fa[N];
void gao(int now, int x, int pre) {
  ans[now] = min(ans[now], x);
  for (auto k : v[now]){
    if (k == pre)
      continue;
    gao(k, min(x, k), now);
  }
}
int main() {
  int n, m, last = 0;
  scanf("%d%d", &n, &m);
  for (int i = 0; i <= n; i++)
    ans[i] = 1e9;
  for (int i = 1; i < n; i++) {
    int s, t;
    scanf("%d%d", &s, &t);
    v[s].pb(t);
    v[t].pb(s);
  }
  int sta=0,qq=1e9;
  for (int i = 1; i <= m; i++) {
    int t, z, x;
    scanf("%d%d", &t, &z);
    x = (z + last) % n + 1;
    if (t == 1) {
      if(!sta)gao(x, x, 0),sta=1;
      else{
        qq=min(qq,ans[x]);
      }
    } else {
      last = min(qq,ans[x]);
      printf("%d\n", last);
    }
  }
  return 0;
}
全部评论

相关推荐

03-16 11:19
已编辑
门头沟学院 Java
已经一年没发牛客了,为什么呢,因为没脸发...&nbsp;一年前的我自认为在25届中技术一流,八股无敌,项目出色,但是一年校招的蹉跎让我差点转行。24年春招收割了十几个实习&nbsp;offer&nbsp;之后我去了某家大厂实习到9月份转正失败,那时候的我还没有意识到噩梦将来,7月因为投秋招提前批没反馈,于是开始投了几个实习转正岗位练手又拿了3个中大厂&nbsp;offer,这时的我沉浸在我自以为是的骄傲里。9月秋招正式批开始后我几乎把我能找到的所有的岗位都投了一遍,只收获了大厂海笔,0面试。10月份第一家给我面试的公司是数字马力(蚂蚁的内包),诚恳的说,当时收到这家面试是嚣张的,觉得我拿这个&nbsp;offer&nbsp;如探囊取物,就当个保底吧。...
中街牛奶提子:是啊,不应该在秋招的时候继续投实习岗。也劝26届的,八月末后,实习岗就不应该投,给人错误的行情认知。佬是学院本,觉得约面难,双非何尝不是一样呢,秋招战场的激烈和实习完全不同。当时我秋招的时候也是边面实习,当时面实习面一个过一个觉得自己很优越,觉得能收获一堆实习offer那秋招肯定也行。为什么要在秋招拿一堆实习offer增强自己所谓的虚荣心,当时就是贱,为了所谓的攀比虚荣心
点赞 评论 收藏
分享
纸鹰:对他说:“你好,我是百度JAVA。”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务