首页 > 其他分享 >可持久化字典树

可持久化字典树

时间:2023-08-26 16:26:01浏览次数:34  
标签:cnt 持久 ll tr now 字典

例题传送门:异或运算

还不错的题

既然要异或运算,我们可以想到按位枚举,用字典树去存。

既然要找第 \(k\) 大,我们可以想到主席树。

所以这题就是:可持久化字典树

考虑到这题 \(n,p\) 较小,可以直接枚举,而 \(m\) 较大,我们可以用可持久化字典树去存 \(y_i\),查询的时候就模拟字典树的查询,考虑第 \(i\) 位是 \(1\) 还是 \(0\),时间复杂度 \(O(np \log m)\),可以接受。

上代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1050,M=300050;
ll n,m,p;
ll x[N],y[M];
struct jgt
{
	ll ch[2],cnt;
}tr[M*40];
ll rt[M],tot;
void add(ll &now,ll last,ll x,ll sz)
{
	now=++tot;
	tr[now]=tr[last];
	tr[now].cnt++;
	if(sz<0) return ;
	if((x&(1<<sz))) add(tr[now].ch[1],tr[last].ch[1],x,sz-1);
	else add(tr[now].ch[0],tr[last].ch[0],x,sz-1);
}
ll now[N],last[N];
ll updQ(ll lx,ll rx,ll ly,ll ry,ll k)
{
	for(ll i=lx;i<=rx;i++)
	{
		now[i]=rt[ry];
		last[i]=rt[ly-1];
	}
	ll re=0,cnt;
	bool flag;
	for(ll i=31;i>=0;i--)
	{
		cnt=0;
		for(ll j=lx;j<=rx;j++)
		{
			if((x[j]&(1<<i))) cnt=cnt+tr[tr[now[j]].ch[0]].cnt-tr[tr[last[j]].ch[0]].cnt;
			else cnt=cnt+tr[tr[now[j]].ch[1]].cnt-tr[tr[last[j]].ch[1]].cnt;
		}
		if(k<=cnt)
		{
			flag=true;
			re=((re<<1)|1);
		}
		else
		{
			k-=cnt;
			flag=false;
			re=(re<<1);
		}
		for(ll j=lx;j<=rx;j++)
		{
			if(flag)
			{
				if((x[j]&(1<<i))) now[j]=tr[now[j]].ch[0],last[j]=tr[last[j]].ch[0];
				else now[j]=tr[now[j]].ch[1],last[j]=tr[last[j]].ch[1];
			}
			else
			{
				if((x[j]&(1<<i))) now[j]=tr[now[j]].ch[1],last[j]=tr[last[j]].ch[1];
				else now[j]=tr[now[j]].ch[0],last[j]=tr[last[j]].ch[0];
			}
		}
	}
	return re;
}
int main()
{
	scanf("%lld %lld",&n,&m);
	for(ll i=1;i<=n;i++)
	scanf("%lld",&x[i]);
	for(ll i=1;i<=m;i++)
	{
		scanf("%lld",&y[i]);
		add(rt[i],rt[i-1],y[i],31);
	}
	scanf("%lld",&p);
	ll t1,t2,t3,t4,t5;
	for(ll i=1;i<=p;i++)
	{
		scanf("%lld %lld %lld %lld %lld",&t1,&t2,&t3,&t4,&t5);
		printf("%lld\n",updQ(t1,t2,t3,t4,t5));
	}
	return 0;
}

标签:cnt,持久,ll,tr,now,字典
From: https://www.cnblogs.com/pengchujie/p/17658945.html

相关文章

  • easypoi导入导出字段字典码值自动转换
    1.replace进行内容替换@Excel(name="是否有效",width=30,replace={"是_1","否_0","_null"})privateStringisEffective;Excel文件内'是否有效'这列的数据将会根据replace规则替换,例如'是'会被替换为'1',空白会被替换为null。反过来导出数据到E......
  • 【主席树】洛谷 P3834 可持久化线段树 2
    【主席树】洛谷P3834可持久化线段树2题目链接:https://www.luogu.com.cn/problem/P3834主席树是可持久化线段树的一种,也叫做可持久化权值线段树,主要可以用来O(logn)求静态区间的第k小数。总所周知,普通线段树每次修改会遍历logn个点,那么我们在每次修改时都把这logn个点复制一份......
  • Redis-持久化的学习
    持久化-rdbredis.conf中已经自动配置好了持久化设置,但我们可以改为自己需要的设置。当条件触发时会在同级文件夹内生成dump.rdb文件(快照)。 触发条件:1:满足config中设置的触发条件2:使用flushall命令3:退出redis,也会自动生成dump.rdb  如何打开rdb文件?在redis中输入conf......
  • 可持久化线段树标记永久化?可刺激化修道士表舅已经黑!
    关于可刺激化修道士表舅已经黑。因为傻逼lxd告诉我我的表舅已经黑写法是错误的,所以稀里糊涂的让他改成了他的那种写法。但是我的也是对的。比如区间加和区间查和,维护一个\(tag\),表示表舅的值。然后在区间加的时候,经过的区间的\(sum\)的值可以直接加,但是只有在if(x<=l&......
  • 字典树学习笔记
    字典树字典树(Trie)简介又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比......
  • Go语言字典(map)的使用
    目录3.字典(map)的使用3.1字典的初始化方式1:3.2字典的初始化方式2:3.3字典的初始化方式3:3.4字典的遍历1:3.5字典的遍历2:3.6判断字典中有无某个key3.7删除字典中的某个键值对3.字典(map)的使用3.1字典的初始化方式1:packagemainimport"fmt"funcmain(){ varscoreM......
  • 定义一个函数,传入一个字典和一个元组,将字典的值(key不变)和元组的值交换,返回交换后的
    知识点:zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。li=[3,4,5]t=(7,8,9)print(list(zip(li,t)))print(dict(zip(li,t)))运行截图:例1:deff(a,b):print(a)print(b)#先获取对应的元素b......
  • GEO,持久化方案,主从复制,
    目录1GEO地理位置信息1持久化方案1.1RDB1.2aof方案1.3混合持久化2主从复制原理和方案3哨兵高可用1集群原理及搭建1.1集群搭建1.2集群扩容1.3集群缩容1GEO地理位置信息#GEO(地理信息定位):存储经纬度,计算两地距离,范围等 -根据经纬度---》确定具体地址的---》高德开放a......
  • 真香!基于 Prometheus 的持久化存储,全是知识点
    Prometheus将基于告警规则生成的告警存储为时间序列,不会将Alertmanager的告警信息持久化存储,那么针对历史告警的检索、统计等需求就无法实现。因此需要一种持久化机制用于存储历史告警信息,本文主要探究基于alertmanager告警的开源持久化方案。1.告警触发机制基于主机层面内存......
  • swift学习笔记之---数组、字典、枚举、结构体
    1、数组-Arraylettypes=["none","warning","error"]//省略类型的数组声明letmenbers=[String]()//声明一个空数组menbers.append("six")//添加元素menbers+=["seven"]//添加元素menbers.insert("one"......