首页 > 其他分享 >array-value

array-value

时间:2024-08-08 17:09:40浏览次数:12  
标签:子树 trie mid value 异或 端点 区间 array

赛时想到了二分+trie但是却没有想到怎么维护啊

看到异或,可以想位运算,trie和异或基。跟位运算肯定没啥关系,而异或基是选任意多个数进行异或,trie是两个数进行异或,所以这道题目用trie

二分,考虑是否存在至少\(k\)个区间不超过\(mid\)

check函数:我们枚举区间的右端点\(r\),找到一个最大的\(l\)使得\(a_l⊕a_r≤mid\),那么如果区间左端点是\([1,l]\),肯定都可以被统计(当然区间左端点也可能是\([l+1,r-1]\),这种情况我们之后处理,先找出必要条件)

如何找到\(l\)?我们对trie树上的每一个点记录一个值表示这个点的子树所代表的\(a\)的最大的位置。将\(a_r\)与\(mid\)放在trie树上查找。此时trie树已经插入了\(a_1\) ~ \(a_{r-1}\),我们从高位到低位进行查找,假设我们当前查找到了第\(i\)位,且从第\(i+1\)位到最高位我们当前异或出来的数都与\(mid\)的第\(i+1\)位到最高位相同,那么对于第\(i\)位:

如果\(mid\)的这一位为\(1\),显然我们\(a_r\)的这一位同方向走到底的任何一个位置都可以,所以将同方向子树位置最大值记录在答案中,然后向反方向子树走一步

如果\(mid\)的这一位为\(0\),我们只能朝\(a_r\)的这一位同方向子树走

注意处理走的时候无解的情况

对每个\(r\)都处理完后,我们还要处理一下上面括号中说的情况。设\(f[i]\)表示以\(i\)为右端点,最大的左端点满足\([f[i],i]\)这个区间符合条件(也就是说\([f[i]+1,i]\)这个区间存在一对数使得异或值大于\(mid\)),假设\(1\) ~ \(i-1\)已经处理好了,那么对于新增加的\(i\),\(f[i]\)要么是之前我们找到的\(l\),要么是\(f[i-1]\),取最大值就好了

标签:子树,trie,mid,value,异或,端点,区间,array
From: https://www.cnblogs.com/dingxingdi/p/18349305

相关文章

  • ValueError:层“dense_2”需要 1 个输入,但它收到了 2 个输入张量
    我无法加载我的模型,它一直显示错误ValueError:层“dense_2”需要1个输入,但它收到了2个输入张量。收到的输入:[<KerasTensorshape=(None,7,7,1280),dtype=float32,稀疏=False,name=keras_tensor_2896>,<KerasTensorshape=(None,7,7,1280),dtype=float32,稀疏=F......
  • new_d_array()函数接受一个int类型的参数和double类型的参数。该函数返回一个指针,指向
    /*下面是使用变参函数的一段程序:include<stdio.h>include<string.h>incude<stdarg.h>voidshow_array(constdoublear[],intn);double*new_d_array(intN,...);intmain(void){doublep1;doublep2;p1=new_d_array(5,1.2,2.3,3.4,4.5,5.6);p2=new_d_ar......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • C. Even Subarrays
    原题链接题解这题用到的知识点很多,思维+前缀异或+容斥原理。1、题目告诉我们要找被除数个数是偶数个的异或和,那么什么数的被除数有偶数个?答案:非完全平方数。2、非完全平方数太多了,不好求。而我们又知道所有序列个数为(n+1)*n/2所以我们只要求出序列异或和为完全平方数......
  • 2024牛客暑期多校训练营7 C Array Sorting 题解
    乱搞非正解写法。分类讨论各种情况。降序排序对应交换即可数组个数小直接考虑相邻的交换其他都看做随机数据考虑结合前面情况,很容易想到,先把数组变成一个尽量有序的数组(每个元素和自己正确的位置相差不大)。最后再多次相邻交换,使得每个元素都在正确位置。把数组变成......
  • Number of k-good subarrays
    我们发现,如果我们将满足题意的点在数轴上标出,那么我们可以获得若干个连续段。对于一个长度为\(l\)的连续段,他对答案的贡献就是\(\frac{l(l+1)}{2}\),我们把所有连续段的贡献加起来就得到了答案于是我们发现这个可以拆分成子问题,具体见这篇题解。\(sol(n-mx,k-1)\)就是拆分成的子问......
  • ArrayList和LinkList实现的比较
    一、ArrayList和LinkList实现的比较1.使用get()获取元素1.1ArrayList.get()​ 如果希望使用ArrayList的get(intindex)方法获取元素,实现可以简单地将这项任务委托给其内部数组:publicEget(intindex){rangeCheck(index);returnelementData(index);}​ 当然,......
  • Java集合:Collection and Map;ArrayList;LinkList;HashSet;TreeSet;HashMap;TreeMap;Iterator:
        集合介绍:                        是一组变量类型(容器),跟数组很像。一,引用集合的原因(必要性):                  A:数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。          B:使用数......
  • 面试考点分析( ArrayList和LinkedList对比)
    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.两者都是线程不安全,都实现了Collection接口。3.数据结构:ArrayList是基于动态数组的数据结构,LinkedList是基于双向链表的数据结构。性能:ArrayList支持随机访问,查询快,增删慢,查询的时间复杂度为O(1),插......
  • 仓颉编程语言入门 -- Array数组详解
    仓颉编程语言入门–Array数组详解一.如何创建Array数组我们可以使用Array类型来构造单一元素类型,有序序列的数据。1.仓颉使用Array来表示Array类型。T表示Array的元素类型,T可以是任意类型,类似于泛型的概念vararr:Array<String>=["你好","仓颉"]va......