首页 > 其他分享 >P4735 最大异或和

P4735 最大异或和

时间:2022-08-30 16:24:34浏览次数:59  
标签:le 最大 int trie 异或 P4735 oplus now latest

给定一个非负整数序列 \(\{a\}\),初始长度为\(n\)。

有 \(m\) 个操作,有以下两种操作类型:

  1. A x:添加操作,表示在序列末尾添加一个数 \(x\),序列的长度 \(n+1\)。
  2. Q l r x:询问操作,你需要找到一个位置 \(p\),满足\(l \le p \le r\),使得: $
    a[p] \oplus a[p+1] \oplus ... \oplus a[N] \oplus x$ 最大,输出最大是多少。

\(N,M \le 300000\),\(0 \le a[i] \le 10^7\)。


首先对 \(\oplus\) 取前缀和,得到 \(sum\) 数组,然后对于操作2就变成了求 \(sum[p-1]\oplus sum[N]\oplus x\) , \(p\in [l,r]\) 。其中后两项可以直接求,前面一项可以在Trie树上贪心求。问题就在于区间 \([l,r]\) 了,可以将Trie可持久化就可以了。具体来说将每个节点创建一个 \(maxn\) 值,表示所在子树中最大的前缀值,若 \(l\leq maxn\) 则可以查询,否则不能走该节点。

#include<bits/stdc++.h>
using namespace std;
int n,m;
namespace Trie{
	int trie[80000005][2],tcnt,latest[80000005];
	int s[600005],root[600005];
	void insert(int i,int k,int p,int q){
		if(k<0){
			latest[q]=i;
			return;
		}
		int c=(s[i]>>k)&1;
		if(p)
			trie[q][c^1]=trie[p][c^1];
		trie[q][c]=++tcnt;
		insert(i,k-1,trie[p][c],trie[q][c]);
		latest[q]=max(latest[trie[q][0]],latest[trie[q][1]]);
	}
	
	int query(int now,int val,int k,int L){
		if(k<0)
			return s[latest[now]]^val;
		int c=(val>>k)&1;
		if(latest[trie[now][c^1]]>=L)
			return query(trie[now][c^1],val,k-1,L);
		else return query(trie[now][c],val,k-1,L);
	}
}

using namespace Trie;
int main(){
	scanf("%d %d",&n,&m);
	latest[0]=-1;
	root[0]=++tcnt;
	insert(0,23,0,root[0]);
	for(int i=1;i<=n;++i){
		int x;
		scanf("%d",&x);
		s[i]=s[i-1]^x;
		root[i]=++tcnt;
		insert(i,23,root[i-1],root[i]);
	}
	for(int i=1;i<=m;++i){
		char c;
		do{
			c=getchar();
		}while(c!='A' && c!='Q');
		if(c=='A'){
			int x;
			scanf("%d",&x);
			root[++n]=++tcnt;
			s[n]=x^s[n-1];
			insert(n,23,root[n-1],root[n]);
		}
		else{
			int l,r,x;
			scanf("%d %d %d",&l,&r,&x);
			printf("%d\n",query(root[r-1],s[n]^x,23,l-1));
		}
	}
	return 0;
}

标签:le,最大,int,trie,异或,P4735,oplus,now,latest
From: https://www.cnblogs.com/zhouzizhe/p/16639811.html

相关文章

  • P4592 [TJOI2018]异或
    有一颗以\(1\)为根节点的由\(n\)个节点组成的树,节点从\(1\)至\(n\)编号。树上每个节点上都有一个权值\(v_i\)。现在有\(q\)次操作,操作如下:\(1~x~z\):查询节点......
  • 654.最大二叉树+998.最大二叉树II
    654.最大二叉树题目描述给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:创建一个根节点,其值为 nums中的 最大值 。递......
  • 二进制:给定a b数组 在某种顺序下如果能在找到个c=a^b 而且 对c的&值f的值是最大的
    https://codeforces.ml/contest/1721/problem/D因为最终答案必须是唯一的然后从最高位开始当且当ab各个数子的当前位的1和0是一样的时候就可以通过分配使得c数组当......
  • 如何去除一组数据3个最大值和3个最小值
    1、使用trimmean语法TRIMMEAN(array,percent)Array  为需要进行整理并求平均值的数组或数值区域。Percent  为计算时所要除去的数据点的比例,例如,如果percent=0.2,......
  • 二分图最大匹配数量,匈牙利算法求解 python
    二分图最大匹配数量,匈牙利算法求解python,本质上是找增广回路"""#File:hungary.py#Time:2022/8/2821:08#Author:notomato#Description:#"""......
  • 一台服务器​最大并发 tcp 连接数多少?65535?
    首先,问题中描述的65535个连接指的是客户端连接数的限制。在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接。那么对单机,其最大并发t......
  • Apache HTTP Server 修改最大连接数maxclients
    ApacheHTTPServer修改最大连接数maxclients--ITeye博客 https://www.iteye.com/blog/awenhaowenchao-1735968 在公司内网用到了apache2做web服务器,每当内部发文......
  • 最大正方形
    问题:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。   输入:matrix=[["1","0","1","0","0"],["1","0","1","1","1"],["1&q......
  • c++ delegate 类,最大16个参数,用程序生成的代码
    2017-02-1604:58:34 发布于 CSDN 现转博客园。 读这篇文章的前提是,我们使用的编辑器对c++11的支持不太友好。下面是测试代码:#include<stdio.h>#include<stdlib......
  • 【重要】LeetCode 662. 二叉树最大宽度
    题目链接注意事项根据满二叉树的节点编号规则:若根节点编号为u,则其左子节点编号为u<<1,其右节点编号为u<<1|1。一个朴素的想法是:我们在DFS过程中使用两个哈希表......