[hdu 6191 Query on A Tree] 사전 트 리 시작 식 병합
                                            
 10369 단어  ACM____데이터 구조
                    
분류:
Data Structure Trie Tree1. 제목 링크[hdu 6191 Query on A Tree]
2. 제목 설명
n 개의 노드 가 있 는 나 무 는 노드 마다 가중치 가 있 습 니 다.그 다음 에 q 개의 질문 은 매번 두 개의 수 u, x 를 포함 하고 u 를 루트 노드 로 하 는 서브 트 리 의 모든 노드 의 가중치 xor x 의 최대 치 를 조회 합 니 다.
3. 문제 풀이 사고방식
이 문 제 는 두 가지 사고방식 이 있다. 첫 번 째 방법 은 dfs 순서 + 지속 가능 한 사전 트 리 이다.두 번 째 방법 은 오프라인 모든 문의 입 니 다.그리고 트 리 를 뒷 차례 dfs 로 옮 겨 다 닐 때 시작 식 으로 사전 트 리 를 합 쳐 답 을 기록 합 니 다.
4. 구현 코드
#include  pll;
typedef pair puu;
typedef pair pbb;
typedef vector<int> vi;
const int inf = 0x3f3f3f3f;
const ll infl = 0x3f3f3f3f3f3f3f3fLL;
template<typename T> inline void umax(T &a, T b) { a = max(a, b); }
template<typename T> inline void umin(T &a, T b) { a = min(a, b); }
template<typename T> inline T randIntv(const T& a, const T& b) { return (T)rand() % (b - a + 1) + a; }
const int MAXN = 100005;
struct Edge {
    int v, next;
} edge[MAXN];
int n, q, head[MAXN], tot;
ll w[MAXN];
void edge_init() {
    tot = 0;
    memset(head, -1, sizeof(head));
}
void edge_ins(int u, int v) {
    edge[tot] = Edge{v, head[u]};
    head[u] = tot ++;
}
struct Trie {
    static const int BITS = 40;
    static const int null = 0;
    struct TNode {
        int ch[2];
        void I() { ch[0] = ch[1] = 0; }
    } node[MAXN * 50];
    int root[MAXN], tot;
    void init() {
        node[tot = 0].I();
    }
    int new_node() {
        node[++ tot].I();
        return tot;
    }
    void ins(int u, const ll x) {
        int pos = root[u] = new_node();
        for (ll i = BITS - 1; i >= 0; --i) {
            ll j = (x >> i) & 1;
            if (node[pos].ch[j] == null) node[pos].ch[j] = new_node();
            pos = node[pos].ch[j];
        }
    }
    int merge(const int u, const int v) {
        if (u == null) return v;
        if (v == null) return u;
        node[u].ch[0] = merge(node[u].ch[0], node[v].ch[0]);
        node[u].ch[1] = merge(node[u].ch[1], node[v].ch[1]);
        return u;
    }
    ll query(const int u, const ll x) {
        ll ret = 0; int pos = root[u];
        for (ll i = BITS - 1; i >= 0; --i) {
            ll j = (x >> i) & 1;
            if (node[pos].ch[j ^ 1] != null) {
                pos = node[pos].ch[j ^ 1];
                ret = ret << 1ll | 1ll;
            } else {
                pos = node[pos].ch[j];
                ret = ret << 1ll;
            }
            assert(pos != null);
        }
        return ret;
    }
} trie;
vector
", res[i]);
        }
        for (int i = 1; i <= n; ++i) qr[i].clear();
    }
#ifdef ___LOCAL_WONZY___
    cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl;
#endif // ___LOCAL_WONZY___
    return 0;
}
  이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Codeforces \ # 316 D. Tree Requests] DFS 순서, 오프라인, 이분N 개의 노드 를 지정 한 나 무 는 노드 마다 26 개의 소문 자 중의 한 글자 에 대응 하고 노드 i 의 깊이 는 depi 로 기록 합 니 다.M 번 질문 을 할 때마다 노드 u 의 하위 트 리 (노드 u 포함)...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.