正题

题目链接:https://www.luogu.com.cn/problem/P4585


题目大意

\(n\)个集合,开始每个集合中有一个数字。

  1. 开启新的一天并且往集合\(s\)中插入数字\(v\)
  2. 询问\(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】的更多相关文章

  1. 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)

    [题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...

  2. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

  3. [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)

    [FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...

  4. 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie

    感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...

  5. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  6. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  7. 洛谷 P4585 [FJOI2015]火星商店问题 解题报告

    P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...

  8. [洛谷P4585] [FJOI2015] 火星商店问题

    Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...

  9. 【洛谷】P4585 [FJOI2015]火星商店问题

    题解 题目太丧,OJ太没有良心,我永远喜欢LOJ! (TLE报成RE,垃圾洛谷,我永远喜欢LOJ) 好的,平复一下我debug了一上午崩溃的心态= =,写一写这道题的题解 把所有限制去掉,给出一个值, ...

  10. 洛谷 P4585 [FJOI2015]火星商店问题

    (勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...

随机推荐

  1. mongoTemplate 条件查询

    构建条件方法 @Override public Query getQuery(ReportParam param){ //check MeenoAssert.hasLength(param.getUu ...

  2. C#多线程---Semaphore实现线程同步

    一.简介 Semaphore类限制可同时访问某一资源或资源池的线程数.线程通过调用 WaitOne方法将信号量减1,并通过调用 Release方法把信号量加1. 构造函数:public Semapho ...

  3. 使用dom4j工具:设置输出格式compactFormat和PrettyPrint(六)

    package dom4j_write; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStre ...

  4. shiro加密流程

  5. SpringMVC IO 文件上传

    1 public class FileUtil { 2 3 4 /** 5 * 读取文件内容,作为字符串返回 6 */ 7 public static String readFileAsString( ...

  6. JavaScript——数组——数组长度

    JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...

  7. 批量修改Linux密码脚本(Python)

    搭建环境 centos 7.4 使用脚本 python 批量修改connect用户的密码 生成密码为随机密码 保存为xls文档 #!/usr/bin/env python # -*- coding: ...

  8. HashSet的存储原理

    HashSet的底层用哈希散列表来存储对象(默认长度为16的数组),假如: Set set=new HashSet(); set.add(obj); 内部存储过程为:定义h=obj.hashCode, ...

  9. Linux常用命令 - more命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 每次显 ...

  10. Pikachu靶场通关之XSS(跨站脚本)

    一.XSS(跨站脚本)概述 Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XSS可以 ...