当前位置:网站首页>Bucket of P (segment tree + linear basis)
Bucket of P (segment tree + linear basis)
2022-06-26 13:58:00 【__ LazyCat__】
Line segment tree + Linear base
link :P4839 P Brother's bucket - Luogu | New ecology of computer science education (luogu.com.cn)
The question : Insert data at a single point in the interval , Find the exclusive or sum of the largest subset of the interval .
Answer key : Consider the combination of linear bases , Let's take another linear base log Take out the numbers and merge them into the first linear basis , Because numbers that can be synthesized from another linear basis , After merging this linear basis into the first linear basis , The first linear basis can also be combined into a second linear basis , Then we can synthesize those numbers through the second linear basis . Then the union of these linear bases can be maintained by using the line segment tree . Since the linear basis merging complexity is l o g ∗ l o g log*log log∗log, Line tree single point modification , The interval query complexity is q l o g n qlogn qlogn, Then the overall complexity is q ∗ l o g n ∗ l o g 2 p q*logn*log^2p q∗logn∗log2p,q For the number of operations ,n Is the length of the sequence ,p Value range .
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=5e4+5;
int n,m,op,u,v,w;
struct node{
int l,r,p[32];
node():l(0),r(0){
memset(p,0,sizeof(p));}
}t[maxn<<2];
void insert(node&t,int x)
{
for(int i=31;i>=0;i--)
{
if(x>>i&1)
{
if(!t.p[i]){
t.p[i]=x; break;}
x^=t.p[i];
}
}
return;
}
void pushup(int k)
{
memcpy(t[k].p,t[k<<1].p,sizeof(t[k].p));
for(int i=31;i>=0;i--)
{
insert(t[k],t[k<<1|1].p[i]);
}
return;
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)return;
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
return;
}
void update(int k,int pos,int w)
{
int x=t[k].l,y=t[k].r;
if(x==y){
insert(t[k],w); return;}
int mid=x+y>>1;
if(pos<=mid)update(k<<1,pos,w);
else update(k<<1|1,pos,w);
pushup(k); return;
}
node query(int k,int l,int r)
{
int x=t[k].l,y=t[k].r;
if(l<=x&&y<=r)return t[k];
int mid=x+y>>1,flag=0; node res;
if(l<=mid)res=query(k<<1,l,r),flag=1;
if(mid<r)
{
if(!flag)res=query(k<<1|1,l,r);
else
{
node q=query(k<<1|1,l,r); res.r=q.r;
for(int i=31;i>=0;i--)insert(res,q.p[i]);
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n>>m,build(1,1,m);
for(int i=1;i<=n;i++)
{
cin>>op>>u>>v;
if(op==1)update(1,u,v);
else
{
node q=query(1,u,v); int ans=0;
for(int i=31;i>=0;i--)ans=max(ans,ans^q.p[i]);
cout<<ans<<"\n";
}
}
return 0;
}
You can find , This kind of merger is really right , Complexity is also correct . But consider , When we update, we merge from the bottom to the top , Each time, the number will be added to the original linear basis , No fewer numbers . So there is no need to merge , You only need to insert the traversed points when updating .
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=5e4+5;
int n,m,op,u,v,w;
struct node{
int l,r,p[32];
node():l(0),r(0){
memset(p,0,sizeof(p));}
}t[maxn<<2];
void insert(node&t,int x)
{
for(int i=31;i>=0;i--)
{
if(x>>i&1)
{
if(!t.p[i]){
t.p[i]=x; break;}
x^=t.p[i];
}
}
return;
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)return;
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
return;
}
void update(int k,int pos,int w)
{
int x=t[k].l,y=t[k].r; insert(t[k],w);
if(x==y)return;
int mid=x+y>>1;
if(pos<=mid)update(k<<1,pos,w);
else update(k<<1|1,pos,w);
return;
}
void query(node&q,int k,int l,int r)
{
int x=t[k].l,y=t[k].r;
if(l<=x&&y<=r)
{
for(int i=31;i>=0;i--)insert(q,t[k].p[i]);
return;
}
int mid=x+y>>1;
if(l<=mid)query(q,k<<1,l,r);
if(mid<r)query(q,k<<1|1,l,r);
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n>>m,build(1,1,m);
for(int i=1;i<=n;i++)
{
cin>>op>>u>>v;
if(op==1)update(1,u,v);
else
{
node q; query(q,1,u,v); int ans=0;
for(int i=31;i>=0;i--)ans=max(ans,ans^q.p[i]);
cout<<ans<<"\n";
}
}
return 0;
}
Query operation small optimization : It is found that it takes too much time to re create the structure every time each point is queried . Then create one initially and insert it slowly .
边栏推荐
- 虫子 STL string 下 练习题
- 虫子 类和对象 上
- Solutions to the failure of last child and first child styles of wechat applet
- 证券开户安全吗,有没有什么危险啊
- I met the problem of concurrent programming in an interview: how to safely interrupt a running thread
- [proteus simulation] Arduino uno key start / stop + PWM speed control DC motor speed
- Thinking caused by the error < note: candidate expectations 1 argument, 0 provided >
- 8. Ribbon load balancing service call
- Bigint: handles large numbers (integers of any length)
- Zero basics of C language lesson 7: break & continue
猜你喜欢

Common operation and Principle Exploration of stream

awk工具

windows版MySQL软件的安装与卸载

Detailed sorting of HW blue team traceability process

Variable declaration of typescript

I met the problem of concurrent programming in an interview: how to safely interrupt a running thread

Network remote access using raspberry pie

爱可可AI前沿推介(6.26)

Exercise set 1

Cloudcompare - Poisson reconstruction
随机推荐
33. Use rgbd camera for target detection and depth information output
Some conclusions about Nan
Ubuntu installation and configuration PostgreSQL (18.04)
古瑞瓦特沖刺港交所上市:創下“多個第一”,獲IDG資本9億元投資
ICML 2022 | limo: a new method for rapid generation of targeted molecules
Teacher Li Hang's new book "machine learning methods" is on the market! Purchase link attached
Aesthetic experience (episode 238) Luo Guozheng
程序员必备,一款让你提高工作效率N倍的神器uTools
Wechat applet Registration Guide
嵌入式virlog代码运行流程
Mongodb series window environment deployment configuration
Postman自动化接口测试
古瑞瓦特冲刺港交所上市:创下“多个第一”,获IDG资本9亿元投资
Traverse the specified directory to obtain the file name with the specified suffix (such as txt and INI) under the current directory
Basic type of typescript
Gee - Global Human Settlements grid data 1975-1990-2000-2014
7-2 picking peanuts
Generate JDE dot train
证券开户安全吗,有没有什么危险啊
使用 Performance 看看浏览器在做什么