P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】
正题
题目链接:https://www.luogu.com.cn/problem/P4585
题目大意
\(n\)个集合,开始每个集合中有一个数字。
- 开启新的一天并且往集合\(s\)中插入数字\(v\)
- 询问\(d\)天以内插入的数字(包括最开始的)中\(l\sim r\)集合内的数字异或上\(x\)的最大值。
所有数字均在\([0,10^5]\)范围内
解题思路
线段树上每个节点维护一个可持久化\(Trie\)。
每次插入就把包含\(s\)的节点插入数字\(v\)。
询问就正常查询即可。
时空间复杂度都是\(O(n\log^2 n)\)
好像还有空间是\(O(n\log n)\)的线段树分治算法,不过懒得写了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m,cnt,p[N],rt[N<<2];
int ch[N<<9][2],last[N<<9];
int Insert(int x,int val,int id,int k=16){
int y=++cnt;
if(k<0){last[y]=id;return y;}
int c=(val>>k)&1;
ch[y][c^1]=ch[x][c^1];
ch[y][c]=Insert(ch[x][c],val,id,k-1);
last[y]=max(last[ch[y][0]],last[ch[y][1]]);
return y;
}
int Ask(int x,int val,int lim,int k=16){
if(k<0)return val;
int c=(val>>k)&1;
if(last[ch[x][c^1]]>=lim)
return Ask(ch[x][c^1],val|(1<<k),lim,k-1);
if(last[ch[x][c]]>=lim)
return Ask(ch[x][c],val^(val&(1<<k)),lim,k-1);
return 0;
}
void Change(int x,int l,int r,int pos,int id,int val){
rt[x]=Insert(rt[x],val,id);
if(l==r)return;int mid=(l+r)>>1;
if(pos<=mid)Change(x*2,l,mid,pos,id,val);
else Change(x*2+1,mid+1,r,pos,id,val);
return;
}
int Query(int x,int L,int R,int l,int r,int val,int lim){
if(L==l&&R==r)return Ask(rt[x],val,lim);
int mid=(L+R)>>1;
if(r<=mid)return Query(x*2,L,mid,l,r,val,lim);
if(l>mid)return Query(x*2+1,mid+1,R,l,r,val,lim);
return max(Query(x*2,L,mid,l,mid,val,lim),Query(x*2+1,mid+1,R,mid+1,r,val,lim));
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
p[i]=Insert(p[i-1],x,i);
}
int id=0;
for(int i=1;i<=m;i++){
int op;scanf("%d",&op);
if(op){
int l,r,x,d,ans=0;
scanf("%d%d%d%d",&l,&r,&x,&d);
ans=Query(1,1,n,l,r,x,id-d+1);
ans=max(ans,Ask(p[r],x,l));
printf("%d\n",ans);
}
else{
int s,v;
scanf("%d%d",&s,&v);id++;
Change(1,1,n,s,id,v);
}
}
return 0;
}
P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】的更多相关文章
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- [洛谷P4585] [FJOI2015] 火星商店问题
Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...
- 【洛谷】P4585 [FJOI2015]火星商店问题
题解 题目太丧,OJ太没有良心,我永远喜欢LOJ! (TLE报成RE,垃圾洛谷,我永远喜欢LOJ) 好的,平复一下我debug了一上午崩溃的心态= =,写一写这道题的题解 把所有限制去掉,给出一个值, ...
- 洛谷 P4585 [FJOI2015]火星商店问题
(勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...
随机推荐
- SpringBoot使用@Scheduled创建定时任务
定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...
- Springboot使用MatrixVariable 注解
根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对.规范中没对对应的术语.一般 "URL 路径参数" 可以被应用,尽管更加独特的 &qu ...
- 【GIS】点图层符号的方向和大小
方向:根据属性字段设置点图层中每个要素的符号方向和大小, 1 所有要素使用同一种符号---简单渲染 在图层属性---符号系统---单一符号中进行设置,首先设置符号,在后面的[高级]选项按钮中分别设置[ ...
- 如何配置https
1.创建证书:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey 其中姓氏和组织名称为登录时的域名:如localho ...
- sql函数大全
sql函数大全 一.内部函数 1.内部合计函数 1)COUNT(*) 返回行数 2)COUNT(DISTINCT COLNAME) 返回指定列中唯一值的个数 3)SUM(COLNAME/EXPRESS ...
- Nginx+Tomcat+Memcached实现session共享
实验环境: server1:nginx tomcat memcached server2:tomcat memcached Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入 ...
- IT人计算机网络浅析
LAN: 局域网 local Area Network WAN: 广域网 Wide Area Network WAN = LAN +LAN+....+LAN 多个LAN 组成 WAN OSI 七层协议 ...
- Hive的分桶表
[分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...
- shell脚本测试变量是否为空,测试文件是否存在,sed修改配置文件参数,分支语句
Shell脚本 1. 基本的几个变量 使用$?获取最近一次的执行结果: 使用$#获取传递的参数个数,类似C语言中的int argc; 使用$@获取所有的传参,类似C语言的char **argv 2. ...
- 只需3步,快来用AI预测你爱的球队下一场能赢吗?
摘要:作为球迷,我们有时候希望自己拥有预测未来的能力. 本文分享自华为云社区<用 AI 预测球赛结果只需三步,看看你爱的球队下一场能赢吗?>,作者:HWCloudAI. 还记得今年夏天的欧 ...