首页 > 其他 > 详细

腿部挂件「NOIP多校联考 2019」

时间:2019-10-02 16:58:59      阅读:118      评论:0      收藏:0      [点我收藏+]

题意

给定序列以及若干询问,每次询问格式为X L R,询问区间[L,R]中与X最大的异或值。


思路

看到异或很容易想到01trie,由于询问[L,R],所以需要可持久化。

代码

#include <bits/stdc++.h>

using namespace std;

namespace StandardIO {

    template<typename T>inline void read (T &x) {
        x=0;T f=1;char c=getchar();
        for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;
        for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
        x*=f;
    }

    template<typename T>inline void write (T x) {
        if (x<0) putchar('-'),x*=-1;
        if (x>=10) write(x/10);
        putchar(x%10+'0');
    }

}

using namespace StandardIO;

namespace Project {
    
    const int N=200200;
    
    int n,q;
    int tot;
    int root[N];
    struct node {
        int cnt;
        int ch[2];
    } trie[N<<5];
    
    void update (int dep,int x,int &pos) {
        trie[++tot]=trie[pos],pos=tot,++trie[pos].cnt;
        if (dep==-1) return;
        update(dep-1,x,trie[pos].ch[(x>>dep)&1]);
    }
    int query (int dep,int x,int last,int cur) {
        if (dep==-1) return 0;
        int o=(x>>dep)&1;
        if (trie[trie[last].ch[o^1]].cnt<trie[trie[cur].ch[o^1]].cnt) return query(dep-1,x,trie[last].ch[o^1],trie[cur].ch[o^1])|(1<<dep);
        return query(dep-1,x,trie[last].ch[o],trie[cur].ch[o]);
    }

    inline void MAIN () {
        read(n),read(q);
        for (register int i=1,x; i<=n; ++i) {
            read(x);
            root[i]=root[i-1];
            update(31,x,root[i]);
        }
        while (q--) {
            int x,l,r;
            read(x),read(l),read(r);
            write(query(31,x,root[l],root[r+1])),putchar('\n');
        }
    }
    
}

int main () {
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    Project::MAIN();
}

腿部挂件「NOIP多校联考 2019」

原文:https://www.cnblogs.com/ilverene/p/11617525.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!