正题

题目链接: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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=1e5+10;
  6. int n,m,cnt,p[N],rt[N<<2];
  7. int ch[N<<9][2],last[N<<9];
  8. int Insert(int x,int val,int id,int k=16){
  9. int y=++cnt;
  10. if(k<0){last[y]=id;return y;}
  11. int c=(val>>k)&1;
  12. ch[y][c^1]=ch[x][c^1];
  13. ch[y][c]=Insert(ch[x][c],val,id,k-1);
  14. last[y]=max(last[ch[y][0]],last[ch[y][1]]);
  15. return y;
  16. }
  17. int Ask(int x,int val,int lim,int k=16){
  18. if(k<0)return val;
  19. int c=(val>>k)&1;
  20. if(last[ch[x][c^1]]>=lim)
  21. return Ask(ch[x][c^1],val|(1<<k),lim,k-1);
  22. if(last[ch[x][c]]>=lim)
  23. return Ask(ch[x][c],val^(val&(1<<k)),lim,k-1);
  24. return 0;
  25. }
  26. void Change(int x,int l,int r,int pos,int id,int val){
  27. rt[x]=Insert(rt[x],val,id);
  28. if(l==r)return;int mid=(l+r)>>1;
  29. if(pos<=mid)Change(x*2,l,mid,pos,id,val);
  30. else Change(x*2+1,mid+1,r,pos,id,val);
  31. return;
  32. }
  33. int Query(int x,int L,int R,int l,int r,int val,int lim){
  34. if(L==l&&R==r)return Ask(rt[x],val,lim);
  35. int mid=(L+R)>>1;
  36. if(r<=mid)return Query(x*2,L,mid,l,r,val,lim);
  37. if(l>mid)return Query(x*2+1,mid+1,R,l,r,val,lim);
  38. return max(Query(x*2,L,mid,l,mid,val,lim),Query(x*2+1,mid+1,R,mid+1,r,val,lim));
  39. }
  40. int main()
  41. {
  42. scanf("%d%d",&n,&m);
  43. for(int i=1;i<=n;i++){
  44. int x;scanf("%d",&x);
  45. p[i]=Insert(p[i-1],x,i);
  46. }
  47. int id=0;
  48. for(int i=1;i<=m;i++){
  49. int op;scanf("%d",&op);
  50. if(op){
  51. int l,r,x,d,ans=0;
  52. scanf("%d%d%d%d",&l,&r,&x,&d);
  53. ans=Query(1,1,n,l,r,x,id-d+1);
  54. ans=max(ans,Ask(p[r],x,l));
  55. printf("%d\n",ans);
  56. }
  57. else{
  58. int s,v;
  59. scanf("%d%d",&s,&v);id++;
  60. Change(1,1,n,s,id,v);
  61. }
  62. }
  63. return 0;
  64. }

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. SpringBoot使用@Scheduled创建定时任务

    定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...

  2. Springboot使用MatrixVariable 注解

        根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对.规范中没对对应的术语.一般 "URL 路径参数" 可以被应用,尽管更加独特的 &qu ...

  3. 【GIS】点图层符号的方向和大小

    方向:根据属性字段设置点图层中每个要素的符号方向和大小, 1 所有要素使用同一种符号---简单渲染 在图层属性---符号系统---单一符号中进行设置,首先设置符号,在后面的[高级]选项按钮中分别设置[ ...

  4. 如何配置https

    1.创建证书:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey 其中姓氏和组织名称为登录时的域名:如localho ...

  5. sql函数大全

    sql函数大全 一.内部函数 1.内部合计函数 1)COUNT(*) 返回行数 2)COUNT(DISTINCT COLNAME) 返回指定列中唯一值的个数 3)SUM(COLNAME/EXPRESS ...

  6. Nginx+Tomcat+Memcached实现session共享

    实验环境: server1:nginx tomcat memcached server2:tomcat memcached Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入 ...

  7. IT人计算机网络浅析

    LAN: 局域网 local Area Network WAN: 广域网 Wide Area Network WAN = LAN +LAN+....+LAN 多个LAN 组成 WAN OSI 七层协议 ...

  8. Hive的分桶表

    [分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...

  9. shell脚本测试变量是否为空,测试文件是否存在,sed修改配置文件参数,分支语句

    Shell脚本 1. 基本的几个变量 使用$?获取最近一次的执行结果: 使用$#获取传递的参数个数,类似C语言中的int argc; 使用$@获取所有的传参,类似C语言的char **argv 2. ...

  10. 只需3步,快来用AI预测你爱的球队下一场能赢吗?

    摘要:作为球迷,我们有时候希望自己拥有预测未来的能力. 本文分享自华为云社区<用 AI 预测球赛结果只需三步,看看你爱的球队下一场能赢吗?>,作者:HWCloudAI. 还记得今年夏天的欧 ...