P3652 shallot

问题描述

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

输入格式

输入第一行一个正整数T,表示测试数据组数。
对于每组数据,
第一行两个正整数n表示总时间;
第二行n个整数a1; a2; …; an,若ai大于0代表给了小葱一颗数字为ai的小葱
苗,否则代表从小葱手中拿走一颗数字为ai的小葱苗。

输出格式

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

样例输入

6
1 2 3 4 -2 -3

样例输出

1
3
3
7
7
5

提示

n<=500000,ai<=2^31-1


求从一些数中选取若干个的最大异或和,可以用线性基来做,求出这些数的一组基即可知道答案。

但是线性基只支持插入而不支持删除,因此采用CDQ分治来维护。
预处理出每个数存在的区间 [L,R] [ L , R ] [L,R],对时间分治,每次将存在区间与分治子区间无交的数字插入到子区间的线性基中。底层的线性基就是 [L,L] [ L , L ] [L,L]时刻的答案。

实际实现时,对于每个添加,找到它对应的删除位置,同样对每个删除找到对应的添加位置,然后将在左子区间添加且删除位置在右区间右边的数插入到右区间,将在右区间删除且添加位置在左区间左边的数插入到左区间,然后递归处理。

并不需要每个区间都维护一个线性基,而只需要每一层分治维护一个线性基,回溯的时候将上一层的copy到下一层再插入即可。

时间复杂度 O(nlog2n) O ( n l o g 2 n ) O(n log^2n)

事实上也可以预处理完了之后直接用线段树维护每个位置的线性基,同样只有插入操作,复杂度也一样。


代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#define N 543210
using namespace std;
struct node
{int cnt,c[32];void Ins(int x){for(int i=1;i<=cnt;i++)if((x^c[i])<x)x^=c[i];if(x)c[++cnt]=x;}int Gans(){int sum=0;for(int i=1;i<=cnt;i++)if((sum^c[i])>sum)sum^=c[i];return sum;}
};
int n,a[N],ST[N],EN[N],ans[N];
node s[99];
map<int,int>fa,ct;
void CDQ(int l,int r,int x)
{if(l==r){if(a[l]>0)s[x].Ins(a[l]);ans[l]=s[x].Gans();return;}int mid=l+r>>1,i;s[x+1]=s[x];for(i=mid+1;i<=r;i++)if(a[i]<0&&ST[i]<=l)s[x+1].Ins(-a[i]);CDQ(l,mid,x+1);s[x+1]=s[x];for(i=l;i<=mid;i++)if(a[i]>0&&EN[i]>r)s[x+1].Ins(a[i]);CDQ(mid+1,r,x+1);
}
int main()
{int i,j;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++){if(a[i]>0){ct[a[i]]++;if(ct[a[i]]==1)fa[a[i]]=i;else a[i]=0;}else{ct[-a[i]]--;if(!ct[-a[i]]){ST[i]=fa[-a[i]];EN[fa[-a[i]]]=i;}else a[i]=0;}}for(i=1;i<=n;i++)if(a[i]>0&&!EN[i])EN[i]=n+1;CDQ(1,n,0);for(i=1;i<=n;i++)printf("%d\n",ans[i]);
}

NKOJ 3652 shallot (线性基+CDQ分治)相关推荐

  1. BZOJ 4184 shallot 线性基+分治

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...

  2. BZOJ 4184: shallot 线性基+线段树分治

    复习一下线性基 ~ code: #include <cmath> #include <vector> #include <cstdio> #include < ...

  3. 【BZOJ4184】shallot 线性基

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...

  4. 【BZOJ 4184】shallot 线性基

    一开始一直没有想到因为只是在一直思考线性上怎么做,结果这道题很巧妙的运用的是在线段树上,因为每一个数字的影响其实只是在一段区间上的,这个=很显然,然后就类似于线段树上区间修改打懒惰标记,最后全部dfs ...

  5. Codeforces Round #532 (Div. 2) F. Ivan and Burgers(可持久化异或线性基+双指针)

    题意 给n个数,q组询问,每次询问l到r的最大异或和 思路来源 某cf奆神代码 题解 本来应该是线性基上分治的 这里一发基数+贪心也能过 真是神仙代码啊 双指针的经典应用: 对于每个询问[l,r],r ...

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

    [BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...

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

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

  8. 【BZOJ4184】Shallot(线性基,线段树分治)

    Description 可支持插入.删除.求最大异或值的线性基. Solution 插入.求最大异或值都比较基础. 其实删除也是套路吧,,直接建一棵时间线段树即可. Code /*********** ...

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

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

最新文章

  1. 交通信号灯检测与行人过马路策略
  2. iOS安全攻防(十七):Fishhook
  3. 【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )
  4. Elasticsearch CURL命令
  5. 读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能
  6. 带您探究云存储的奥秘,三分钟帮您快速了解OSS
  7. Redis工作笔记-String类型
  8. 怎样在半年内把一个团队带垮?
  9. 【官方搭建入门】JEECG 平台开发环境搭建必读
  10. linux操作指令训练,实验二linux 常用命令练习
  11. Soul回应赴美上市传闻:不是约会软件 没有确定的上市计划
  12. 基于.NET Socket API 通信的综合应用
  13. oracle 主键自增函数_在 Oracle 中设置自增列
  14. java实现马尔科夫链_马尔科夫链 Markov Chains(示例代码)
  15. 二代测序方法:DNA测序之靶向重测序
  16. Python人脸识别黑科技(二):教你使用python+Opencv完成人脸解锁
  17. 苹果手机用什么软件测试续航,苹果哪个系统最耗电 iOS10/11/12/13电池续航测试
  18. python斐波那契数列
  19. git本地无法上传到远程的问题解决方法
  20. CloudBu面试题

热门文章

  1. python leetcode 398. Random Pick Index
  2. WordCloud词云(超详细)
  3. 34.电脑桌面上的图标下面有下划线怎么去掉:
  4. uniapp cli的使用
  5. 【GitHub】Failed to connect to github.com port 443 的一种解决方案
  6. 小程序腾讯位置服务路线规划插件申请方法
  7. 记我的第一个springboot项目,Roomstore寝室小卖部系统
  8. web中的URL路径——绝对路径和相对路径
  9. cluster命令用法总结
  10. 无法远程连接阿里云服务器