可持久化trie可行吗?

RT

我dfs序+可持久化trie写炸了,但我想应该可以这么做。

写炸的代码

#include <bits/stdc++.h>
#define N 100005
using namespace std;

int n, a[N];
int head[N], to[N], nxt[N], top = 1;
int trie[N * 17][2], ed[N * 17], sum[N * 17], root[N], cnt = 2;
int L[N], R[N], maxx[N], tim;

void inedge(int u, int v) {
    to[top] = v;
    nxt[top] = head[u];
    head[u] = top++;
}

int intrie(int x, int id) {
    int now = root[id] = ++cnt;
    int pre = root[id - 1];
    for(int i = 17;~i;i--) {
        int ch = (x & (1 << i)) ? 1 : 0;
        trie[now][0] = trie[pre][0];
        trie[now][1] = trie[pre][1];
        sum[now] = sum[pre] + 1;
        trie[now][ch] = cnt++;
        now = trie[now][ch];
        pre = trie[pre][ch];
    }
    ed[now] = id;
}

int find(int pt, int nt, int v) {
    for(int i = 17;~i;i--) {
        int ch = (v & (1 << i)) ? 1 : 0;
        if(sum[trie[nt][ch ^ 1]] - sum[trie[pt][ch ^ 1]]) {
            nt = trie[nt][ch ^ 1];
            pt = trie[pt][ch ^ 1];
        } else {
            nt = trie[nt][ch];
            pt = trie[pt][ch];
        }
    }
    return ed[nt];
}

int dfs(int x) {
    int ls;
    intrie(maxx[x] = a[x], L[x] = ++tim);
    for(int i = head[x];i;i = nxt[i])
        if((ls = dfs(to[i])) > maxx[x])
            maxx[x] = ls;
    R[x] = tim;
    return maxx[x];
}

void init() {
    scanf("%d", &n);
    int u, v;
    for(int i = 1;i < n;i++) {
        scanf("%d%d", &u, &v);
        inedge(u, v);
    }
    for(int i = 1;i <= n;i++)
        scanf("%d", a + i);
    dfs(1);
}

void work() {
    int m, p;
    scanf("%d", &m);
    while(m--) {
        scanf("%d", &p);
        int ans = maxx[p], pre = 0;
        while(ans > pre) {
            pre = ans;
            ans ^= a[find(root[L[p] - 1], root[R[p]], pre)];
        }
        printf("%d\n", pre);
    }
}

int main() {
    init();
    work();
    return 0;
}

爆0可还行,我要死了QAQ

全部评论
可持久化Trie树你不是只能找一个数吗,你怎么实现子树?
点赞 回复 分享
发布于 2019-08-22 14:08

相关推荐

10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务