码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3261:最大异或和——题解

时间:2018-03-08 14:11:15      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:size   href   作者   pac   cstring   class   表示   ref   gpo   

http://www.lydsy.com/JudgeOnline/problem.php?id=3261

给定一个非负整数序列{a},初始长度为N。
有M个操作,有以下两种操作类型:
1、A x:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。
2、Q l r x:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。

前置技能:HDU4825

会了这个前置技能之后默认你会如何建trie跑贪心了。

参考:https://www.cnblogs.com/y7070/p/5000471.html

对于一段区间的异或和=r的前缀异或和^l-1的前缀异或和。

所以我们处理出所有前缀异或和完后往trie上插。

不过由于是区间询问,所以按照主席树(可持久化线段树)的想法,我们建立可持久化trie,具体的建立方法大致和主席树差不多,就不多讲了直接看代码吧。

(先割在这里,去吃饭了。)

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=6e5+5;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch==-;ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline char getc(){
    char ch=getchar();
    while(ch!=A&&ch!=Q)ch=getchar();
    return ch;
}
struct node{
    int son[2],sum;
}tr[50*N];
int tot,b[N],rt[N],pool;
void insert(int y,int &x,int k,int now){
    tr[x=++pool]=tr[y];
    tr[x].sum++;
    if(now<0)return;
    bool p=k&(1<<now);
    insert(tr[y].son[p],tr[x].son[p],k,now-1);
    return;
}
int query(int nl,int nr,int k,int now){
    if(now<0)return 0;
    bool p=k&(1<<now);
    int delta=tr[tr[nr].son[p^1]].sum-tr[tr[nl].son[p^1]].sum;
    if(delta>0)return (1<<now)+query(tr[nl].son[p^1],tr[nr].son[p^1],k,now-1);
    else return query(tr[nl].son[p],tr[nr].son[p],k,now-1);
}
int main(){
    int n=read()+1,m=read();
    for(int i=2;i<=n;i++)b[i]=b[i-1]^read();
    for(int i=1;i<=n;i++)insert(rt[i-1],rt[i],b[i],24);
    for(int i=1;i<=m;i++){
    char ch=getc();
    if(ch==A){
        b[++n]=b[n-1]^read();
        insert(rt[n-1],rt[n],b[n],24);
    }else{
        int l=read(),r=read(),x=read();
        printf("%d\n",query(rt[l-1],rt[r],b[n]^x,24));
    }
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3261:最大异或和——题解

标签:size   href   作者   pac   cstring   class   表示   ref   gpo   

原文地址:https://www.cnblogs.com/luyouqi233/p/8527581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!