【BZOJ4184】shallot(线段树分治,线性基)

题面

权限题啊。。。。。好烦。。

Description

小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且
让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗?
你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0。

Input

第一行一个正整数n表示总时间;第二行n个整数a1,a2...an,若ai大于0代表给了小葱一颗数字为ai的小葱苗,否则代表从小葱手中拿走一颗数字为-ai的小葱苗。

Output

输出共n行,每行一个整数代表第i个时刻的最大异或和。

Sample Input

6
1 2 3 4 -2 -3

Sample Output

1
3
3
7
7
5

HINT

N<=500000,Ai<=2^31-1

题解

发现每次询问的时间是单点,每个数出现的时间是一个区间。
所以先用一个链表之类的东西维护出每个数字出现的区间。
然后对应到线段树上面去。
发现如果要知道答案,就需要对于所有在当前时间出现了的数构建一个线性基。
但是线性基不支持删除,所以在线段树分治的时候直接带一个线性基进去作为函数值就好了。
时间复杂度\(O(nlog^2)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define lson (now<<1)
#define rson (now<<1|1)
#define MAX 500500
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int n,a[MAX],S[MAX],len,ans[MAX];
struct Number{int x,l,r;}p[MAX];
vector<int> seg[MAX<<2];
int nt[MAX],h[MAX],tot;
void Modify(int now,int l,int r,int L,int R,int x)
{if(L<=l&&r<=R){seg[now].push_back(x);return;}int mid=(l+r)>>1;if(L<=mid)Modify(lson,l,mid,L,R,x);if(R>mid)Modify(rson,mid+1,r,L,R,x);
}
struct xxj
{int p[32],ele;void insert(int x){if(ele==32)return;for(int i=31;~i;--i)if(x&(1<<i)){if(!p[i]){p[i]=x;++ele;break;}x^=p[i];}}int Query(int x){for(int i=31;~i;--i)x=max(x,x^p[i]);return x;}
}G;
void Divide(int now,int l,int r,xxj G)
{for(int i=seg[now].size()-1;(~i)&&G.ele<32;--i)G.insert(seg[now][i]);for(int i=l;i<=r;++i)ans[i]=max(ans[i],G.Query(0));if(l==r)return;int mid=(l+r)>>1;Divide(lson,l,mid,G);Divide(rson,mid+1,r,G);
}
int main()
{freopen("4184.in","r",stdin);freopen("4184.out","w",stdout);n=read();for(int i=1;i<=n;++i)a[i]=read();for(int i=1;i<=n;++i)S[i]=abs(a[i]);sort(&S[1],&S[n+1]);len=unique(&S[1],&S[n+1])-S-1;for(int i=1;i<=n;++i)if(a[i]>0){int x=lower_bound(&S[1],&S[len+1],a[i])-S;nt[++tot]=h[x];h[x]=tot;p[tot]=(Number){a[i],i,0};}else{int x=lower_bound(&S[1],&S[len+1],-a[i])-S;int pos=h[x];p[pos].r=i-1;h[x]=nt[pos];}for(int i=1;i<=tot;++i)if(!p[i].r)p[i].r=n;for(int i=1;i<=tot;++i)Modify(1,1,n,p[i].l,p[i].r,p[i].x);Divide(1,1,n,G);for(int i=1;i<=n;++i)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9383181.html

【BZOJ4184】shallot(线段树分治,线性基)相关推荐

  1. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  2. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  3. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  4. 【BZOJ4184】shallot 线段树+vector+线性基

    [BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...

  5. 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基

    题目链接:A - XOR 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后 ...

  6. [BZOJ4184]shallot 线段树+线性基

    链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...

  7. bzoj 4184 shallot 时间线建线段树+vector+线性基

    题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...

  8. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...

  9. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)

    P3292 [SCOI2016]幸运数字 思路 如果这题是求x,yx, yx,y之间的距离显然我们可以通过树剖加线段树来写, 但是这里变成了求任意个数的异或最大值.如果给定区间我们显然可以通过线性基来 ...

  10. UVALive - 8512——线段树维护线性基

    [题目描述] UVALive - 8512XOR [题目分析] 这种区间+线性基的问题我们可以考虑用线段树维护,线性基的合并的话就直接暴力合并 找到所在区间的线性基后再查找最大的数,我看网上的博客要说 ...

最新文章

  1. 数学等于号是=那三个横杠是什么符
  2. ROS中catkin_make编译输出的可执行文件在哪?
  3. itextsharp php,C#_C#使用iTextSharp设置PDF所有页面背景图功能实例,本文实例讲述了C#使用iTextSharp - phpStudy...
  4. ajax接口调节,前端用ajax调接口怎么破啊?
  5. apache2怎么知道从哪个默认文件夹下去查找网页
  6. 有了防火墙、IPS、WAF 还需要数据库审计?
  7. 第 4 章(表达式和运算符)(4.1~ 4.7)
  8. GAN网络(Generative Adversarial Networks )
  9. linux mysql 8.0启动不了_MySQL官方源从8.0.3直接yum升级到8.0.4后无法启动
  10. iphone连不上微软服务器,windows没法连接到iphone是什么意思
  11. 开源项目bootdo的实战开发笔记
  12. ASPxGridView数据汇总收藏
  13. Word绘制跨行表格
  14. Adobe Flash Player v26.0.0.126发布:请尽快更新
  15. win10专业版修改家庭计算机,win10家庭版升级专业版的最完美的方法_win10专业版技巧...
  16. 30种已验证有效的WordPress博客网上赚钱方法
  17. 微信小程序 组件传值(一) properties 父传子
  18. WIN7无法被远程桌面问题
  19. x-code中蓝色文件夹和绿色文件夹的区别
  20. 计算机怎么打字快,电脑新手如何快速打字?

热门文章

  1. 卷积神经网络识别cifar10
  2. 四元数笔记(1)—— 四元数及其运算
  3. xml 读取转换 excel
  4. PyQt5桌面应用开发(11):摸鱼也要讲基本法之桌面精灵
  5. Java,第二次作业——英里与千米的互换
  6. java实现序列化_java 序列化实现方式总结
  7. 【细谈数据结构】最最最详细的散列表(哈希表)讲解!!!(一)
  8. 自建pop邮件服务器,CentOS邮件服务器搭建系列—— POP / IMAP 服务器的构建( Dovec-站长资讯中心...
  9. 常见的 shell 命令整理
  10. Linux命令之alias