DFS序列

1、Apple Tree

点击查看代码
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int N = 2e5 + 10;
int cnt, head[N];
struct node
{
    int to, nex;
} e[N << 1];
void add_edge(int u, int v)
{
    e[++cnt].to = v;
    e[cnt].nex = head[u];
    head[u] = cnt;
}
int n, m, in[N], out[N], vis[N], idx, c[N];
void dfs(int u)
{
    //cout << u << "\n";
    in[u] = ++idx;
    for(int i = head[u]; i != -1; i = e[i].nex)
    {
        dfs(e[i].to);
    }
    out[u] = idx;
}
int lowbit(int x)
{
    return x & -x;
}
void change(int i, int k)
{
    for(; i <= n; i += lowbit(i)) c[i] += k;
}
int query(int i)
{
    int ans = 0;
    for(; i; i -= lowbit(i)) ans += c[i];
    return ans;
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    memset(head, -1, sizeof head);
    cin >> n;
    int u, v;
    for(int i = 1; i < n; ++i)
    {
        cin >> u >> v;
        add_edge(u, v);
    }
    dfs(1);
    for(int i = 1; i <= n; ++i) change(in[i], 1);
    cin >> m;
    string op;
    while(m-- && cin >> op >> u)
    {
        if(op == "Q")
        {
            cout << query(out[u]) - query(in[u] - 1) << "\n";
        }
        else
        {
            if(vis[u] == 0)
            {
                vis[u] = 1;
                change(in[u], -1);
            }
            else
            {
                vis[u] = 0;
                change(in[u], 1);
            }
        }
    }
    return 0;
}

posted @ 2022-06-28 14:21  std&ice  阅读(119)  评论(0)    收藏  举报