bzoj4184
题解:
按时间分治线段树
然后线性基维护一下就好了
尝试了一下循环展开并没有什么效果
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+;
const int mo=N*;
int n,m,ph[N*],pt[N*],f[N*],g[N*],ans2[N];
int dy[][];
vector<int> ve[N*];
#define rint register int
#define IL inline
char ss[<<],*A=ss,*B=ss;
IL char gc(){return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;}
template<class T> void read(T&x){
rint f=,c;
while (c=gc(),c<||<c)
if (c=='-') f=-;
x=c^;
while (c=gc(),<c&&c<) x=(x<<)+(x<<)+(c^);
x*=f;
}
IL void insert(int x,int y)
{
int xx=x%mo;
while (f[xx]) xx++;
f[xx]=x; g[xx]=y;
}
IL int find(int x)
{
int xx=x%mo;
while (f[xx]!=x) xx++;
return(xx);
}
#define mid ((ph[x]+pt[x])/2)
void build(int x,int h,int t)
{
ph[x]=h; pt[x]=t;
if (h==t) return;
build(x*,h,mid); build(x*+,mid+,t);
}
void insert2(int x,int h,int t,int k)
{
if (h<=ph[x]&&pt[x]<=t)
{
ve[x].push_back(k);
return;
}
if (h<=mid) insert2(x*,h,t,k);
if (mid<t) insert2(x*+,h,t,k);
}
void dfs(int x,int cnt)
{
for (rint i=;i<=;i++) dy[cnt][i]=dy[cnt-][i];
rint len=ve[x].size();
for (rint i=;i<=len/;i++)
{ if (i*>=len) break;
rint y1=ve[x][i*],y2=ve[x][i*+],
y3=ve[x][i*+],y4=ve[x][i*+];
for (rint i1=;i1>=;i1--)
if (y1&(<<i1))
if (!dy[cnt][i1])
{
dy[cnt][i1]=y1; break;
} else y1^=dy[cnt][i1]; if (i*+>=len) break;
for (rint i2=;i2>=;i2--)
if (y2&(<<i2))
if (!dy[cnt][i2])
{
dy[cnt][i2]=y2; break;
} else y2^=dy[cnt][i2]; if (i*+>=len) break;
for (rint i3=;i3>=;i3--)
if (y3&(<<i3))
if (!dy[cnt][i3])
{
dy[cnt][i3]=y3; break;
} else y3^=dy[cnt][i3]; if (i*+>=len) break;
for (rint i4=;i4>=;i4--)
if (y4&(<<i4))
if (!dy[cnt][i4])
{
dy[cnt][i4]=y4; break;
} else y4^=dy[cnt][i4];
}
if (ph[x]==pt[x])
{
rint ans=;
for (rint i=;i>=;i--)
if (dy[cnt][i]&&!(ans&(<<i))) ans^=dy[cnt][i];
ans2[ph[x]]=ans;
return;
}
dfs(x*,cnt+);
dfs(x*+,cnt+);
}
int main()
{
freopen("4184.in","r",stdin);
freopen("4184.out","w",stdout);
read(n);
build(,,n);
for (int i=;i<=n;i++)
{
int x;
read(x);
if (x<)
{
int y=find(-x);
insert2(,g[y],i-,-x);
f[y]=; g[y]=;
} else
{
insert(x,i);
}
}
for (rint i=;i<=N*-;i++)
if (f[i])
{
insert2(,g[i],n,f[i]);
}
dfs(,);
for (int i=;i<=n;i++)
printf("%d\n",ans2[i]);
return ;
}
bzoj4184的更多相关文章
- 【BZOJ4184】shallot(线段树分治,线性基)
[BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...
- 【BZOJ4184】shallot 线段树+vector+线性基
[BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...
- BZOJ4184: shallot
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- BZOJ4184:shallot(线段树分治,线性基)
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基
4184: shallot Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 356 Solved: 180[Submit][Status][Discu ...
- 【BZOJ4184】shallot 线性基
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- [BZOJ4184]shallot 线段树+线性基
链接 题意:给你每个数字出现的时间和消失的时间,求每个时刻最大异或和 题解 按照时间建立线段树,线段树每个节点开个vector存一下这个时间区间有哪些数,然后递归进入的时候加入线性基,开一个栈记录一下 ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
随机推荐
- 通过lua栈了解lua与c的交互
lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...
- 浅谈cookie与session的区别
cookie用的是在客户端保持状态的方案(它是在用户端的会话状态的存贮机制),前端也可以来设置他 所有浏览器都识别,并且会缓存在浏览器中. cookie是以key=value这种键值对的形式保存,每个 ...
- python学习笔记8-异常处理
一.异常处理 在程序运行过程中,总会遇到各种各样的错误.程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理. 下面我们先写一个函数,实现 ...
- AnimateWindow类
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 解决virtualbox与mac文件拖拽问题
apt-get purge virtualbox-guest-x11apt-get autoremove --purgerebootapt-get updateapt-get dist-upgrade ...
- sql server存储过程简单的使用
--创建存储过程 create proc test_proc @date datetime as select * from t_user where times between ),),),),' ...
- Netty入门(3) - ChannelHandler
ChannelPipeline ChannelHandler实例的列表,用于处理或者截获通道的接收和发送数据,让用户可以在ChannelPipeline中完全控制一个事件以及处理ChannelHand ...
- C - Least Crucial Node
题目链接:https://cn.vjudge.net/contest/247936#problem/C 具体大意:给你起点和中点,总点数,边数.求到终点的最小割点. 具体思路:可以用tarjan算法来 ...
- 「About Blockchain(一)」达沃斯年会上的区块链
「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...
- Redis实现聊天功能
在学习了Redis做为消息队列之后研究 了redis聊天的功能. 其实用关系型数据库也可以实现消息功能,自己就曾经用mysql写过一个简单的消息的功能.RDB中思路如下: ** 在实际中可以完全借助m ...