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 ...
随机推荐
- 关于yii2学习笔记:gii的使用
yii2中的gii无疑是非常强大的代码生成工具,以下是我学习使用gii的一些技巧,跟大家分享一下. 以User为例,在数据库中,创建user表. /*Navicat MySQL Data Transf ...
- 服务端负载监控-参考srs服务器源码
#include <map> #include <stdio.h> using namespace std; struct SrsMemoryObject { void* pt ...
- C# 对SQlServer访问的完整类
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.C ...
- WIN10 64bit + QT5.10.0(MinGW3.5.0) + OpenCV3.4.1 无痛安装、配置
安装QT和配置MinGW 官方下载qt-opensource-windows-x86-5.10.0.exe 正常步骤安装QT5.10.0,安装过程选择自带的MinGW3.5.0编译器即可. 打开QtC ...
- AQS实现原理
AQS实现原理 AQS中维护了一个volatile int state(共享资源)和一个CLH队列.当state=1时代表当前对象锁已经被占用,其他线程来加锁时则会失败,失败的线程被放入一个FIFO的 ...
- Markdown Sublime flowchart.js 流程图
先亮出来一个 flowchart.js 的 Sample 给 Sublime 安装 MarkdownPreview,这个不必多说了 Sublime Text -> Preferences -&g ...
- Mybatis-plus<三> MybatisPlus条件构造器
Mybatis-plus<三> MybatisPlus条件构造器 Demo GitHub下载地址:https://github.com/RJvon/Mybatis_plus_demo My ...
- 剑指offer(一)——二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- [考试总结]noip模拟43
这个题目出的还是很偷懒.... 第一题...第二题...第三题...四.... 好吧... 这几次考得都有些问题,似乎可能是有些疲惫,脑袋也是转不太动,考完总觉得自己是能力的问题,但是改一分钟之后会发 ...
- Docker入门之container篇
启动 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容 器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. ...