ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4839 P哥的桶

2022-08-03 20:04:10  阅读:110  来源: 互联网

标签:xor Basis int MAX P4839 ans --


简要题意

(这道题描述是真的长)

你需要维护一个数据结构,支持单点异或和区间求最大异或和。

思路

对于这种区间问题,最容易想到的就是 分块 线段树。

而对于复杂的异或问题,最容易想到的就是 01 Trie 线性基。

合在一起,就是线段是套线性基。(好像还用了顶针的手法)

线段树套线性基不难写,我们可以每一个线段树节点维护一个线性基,然后修改就是插入,查询就把所有查询到的节点合并到一个线性基中,然后再线性基中查询。

线性基想必大家都会,如果不会可以看 这篇博客

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

namespace Basis{
	const int MAX_BIT = 60;
	struct Basis{
		int p[MAX_BIT+5];
		int _how_many_numbers_can_xor;
		void clear(){
			memset(p,0,sizeof(p));
			_how_many_numbers_can_xor=0;
		}
		Basis(){
			clear();
		}
		void insert(int x){
			for(int i=MAX_BIT;i>=0;i--){
				if(!(x>>i))continue;
				if(!p[i]){
					p[i]=x;
					_how_many_numbers_can_xor++;
					break;
				}   
				x^=p[i];
			}
		}
		int max_xor(){
			int ans=0;
			for(int i=MAX_BIT;i>=0;i--){
				if((ans^p[i])>ans){
					ans^=p[i];
				}
			}
			return ans;
		}
		bool can_be_xor(int x){
			for(int i=MAX_BIT;i>=0;i--){
				if(x&(1ll<<i))x^=p[i];
			}
			return x==0;
		}
		int numbers_can_xor(){
			return (1ll<<_how_many_numbers_can_xor);
		}
		void expand(Basis &x){
			for(int i=MAX_BIT;i>=0;i--){
				if(x.p[i]){
					insert(x.p[i]);
				}
			}
		}
	};
}

namespace sgt{
	Basis::Basis t[200005];
	void update(int x,int v,int i,int l,int r){
		t[i].insert(v);
		if(l==r){
			return;
		}
		int mid=(l+r)>>1;
		if(x<=mid){
			update(x,v,i<<1,l,mid);
		}
		else{
			update(x,v,i<<1|1,mid+1,r);
		}
	}
	Basis::Basis result;
	void query(int ql,int qr,int i,int l,int r){
		if(ql<=l&&qr>=r){
			result.expand(t[i]);
			return;
		}
		int mid=(l+r)>>1;
		if(ql<=mid){
			query(ql,qr,i<<1,l,mid);
		}
		if(qr>mid){
			query(ql,qr,i<<1|1,mid+1,r);
		}
	}
}

int n,m;

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	while(n--){
		int op,a,b;
		cin>>op>>a>>b;
		if(op==1){
			sgt::update(a,b,1,1,m);
		}
		else{
			sgt::result.clear();
			sgt::query(a,b,1,1,m);
			cout<<sgt::result.max_xor()<<'\n';
		}
	}
	return 0;
}

(还没有完,别走!)

加强版:P5607 [Ynoi2013] 无力回天 NOI2017

如果将单点修改变成区间修改,那么应该如何处理呢?可以思考一下。

P5607 [Ynoi2013] 无力回天 NOI2017 题解

标签:xor,Basis,int,MAX,P4839,ans,--
来源: https://www.cnblogs.com/zheyuanxie/p/solution-p4839.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有