1 条题解

  • 0
    @ 2026-1-31 22:29:13
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e6 + 10;
    vector<int> G[N];
    struct tnode
    {
      int fa, dep, son, tot, z, tp;
    } t[N];
    void dfs1(int x, int xfa)
    {
      t[x] = tnode{xfa, t[xfa].dep + 1, 0, 1, x, x};
      for (int y : G[x])
        if (y != xfa)
        {
          dfs1(y, x);
          t[x].tot += t[y].tot;
          if (t[t[x].son].tot < t[y].tot)
            t[x].son = y;
        }
    }
    int z, ys[N];
    void dfs2(int x, int tp)
    {
      ++z;
      t[x].z = z;
      t[x].tp = tp;
      ys[z] = x;
      if (t[x].son != 0)
        dfs2(t[x].son, tp);
      for (int y : G[x])
        if (y != t[x].fa && y != t[x].son)
          dfs2(y, y);
    }
    struct trnode
    {
      int l, r, lc, rc, c;
    } tr[2 * N];
    int trlen;
    void bt(int l, int r)
    {
      trlen++;
      int now = trlen;
      tr[now] = trnode{l, r, -1, -1, 999999};
      if (l == r)
        tr[now].c = 999999;
      else
      {
        int mid = (l + r) / 2;
        tr[now].lc = trlen + 1;
        bt(l, mid);
        tr[now].rc = trlen + 1;
        bt(mid + 1, r);
        tr[now].c = min(tr[tr[now].lc].c, tr[tr[now].rc].c);
      }
    }
    void change(int now, int x)
    {
      if (tr[now].l == tr[now].r)
      {
        tr[now].c = (tr[now].c == 999999) ? x : 999999;
        return;
      }
      int mid = (tr[now].l + tr[now].r) / 2, lc = tr[now].lc, rc = tr[now].rc;
      if (x <= mid)
        change(lc, x);
      else
        change(rc, x);
      tr[now].c = min(tr[lc].c, tr[rc].c);
    }
    int findmin(int now, int l, int r)
    {
      if (tr[now].l == l && tr[now].r == r)
        return tr[now].c;
      int mid = (tr[now].l + tr[now].r) / 2, lc = tr[now].lc, rc = tr[now].rc;
      if (r <= mid)
        return findmin(lc, l, r);
      else if (l >= mid + 1)
        return findmin(rc, l, r);
      else
        return min(findmin(lc, l, mid), findmin(rc, mid + 1, r));
    }
    int solve(int x)
    {
      int p = 999999;
      while (x != 0)
      {
        p = min(p, findmin(1, t[t[x].tp].z, t[x].z));
        x = t[t[x].tp].fa;
      }
      return (p == 999999) ? -1 : ys[p];
    }
    
    int main()
    {
      int n, m;
      scanf("%d%d", &n, &m);
      for (int i = 1, x, y; i < n; i++)
      {
        scanf("%d%d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
      }
      t[0] = tnode{0, 0, 0, 0, 0, 0};
      dfs1(1, 0);
      z = 0;
      dfs2(1, 1);
      trlen = 0;
      bt(1, z);
    
      for (int i = 1, p, x; i <= m; i++)
      {
        scanf("%d%d", &p, &x);
        if (p == 0)
          change(1, t[x].z);
        else
          printf("%d\n", solve(x));
      }
      return 0;
    }
    
    
    • 1

    信息

    ID
    547
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    57
    已通过
    22
    上传者