题目描述

火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店。商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价。每个商店每天都有可能进一些新商品,其标价可能与已有商品相同。

火星人在这条商业街购物时,通常会逛这条商业街某一段路上的所有商店,譬如说商店编号在区间[L,R]中的商店,从中挑选1件自己最喜欢的商品。每个火星人对商品的喜好标准各不相同。通常每个火星人都有一个自己的喜好密码x。对每种标价为val的商品,喜好密码为x的火星人对这种商品的喜好程度与val异或x的值成正比。也就是说,val xor x的值越大,他就越喜欢该商品。每个火星人的购物卡在所有商店中只能购买最近d天内(含当天)进货的商品。另外,每个商店都有一种特殊商品不受进货日期限制,每位火星人在任何时刻都可以选择该特殊商品。每个商店中每种商品都能保证供应,不存在商品缺货的问题。

对于给定的按时间顺序排列的事件,计算每个购物的火星人的在本次购物活动中最喜欢的商品,即输出val xor x的最大值。这里所说的按时间顺序排列的事件是指以下2种事件:

事件0,用三个整数0,s,v,表示编号为s的商店在当日新进一种标价为v 的商品。

事件1,用5个整数1,L,R,x,d,表示一位火星人当日在编号为L到R的商店购买d天内的商品,该火星人的喜好密码为x。

题解

考虑如果没有时间限制,我们可以选取的区间为连续一段,那样就是简单的按位贪心,可以用可持久化trie维护。

现在有了时间限制,我们考虑分治,每个询问所覆盖的都是连续一段区间,而且修改之间是独立的,我们可以把每个询问拆成log个挂在按照时间建立的线段树上,然后按时间在线段树上分治。

我们可以每次都重构trie,复杂度是对的。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<algorithm>
  5. #define N 210002
  6. using namespace std;
  7. vector<int>vec[N<<];
  8. int len=,tot,inv[],T[N],ans[N],n,m,tim,top;
  9. inline int rd(){
  10. int x=;char c=getchar();bool f=;
  11. while(!isdigit(c)){if(c=='-')f=;c=getchar();}
  12. while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
  13. return f?-x:x;
  14. }
  15. struct TRIE{
  16. int ch[N*][],size[N*];
  17. inline void ins(int &now,int pre,int x,int deep){
  18. now=++tot;ch[now][]=ch[pre][];ch[now][]=ch[pre][];size[now]=size[pre]+;
  19. if(deep<)return;
  20. if(x&(<<deep))ins(ch[now][],ch[pre][],x,deep-);
  21. else ins(ch[now][],ch[pre][],x,deep-);
  22. }
  23. inline int query(int now,int pre,int x,int deep){
  24. if(deep<)return ;
  25. int o=(x&(<<deep))!=,num=size[ch[now][!o]]-size[ch[pre][!o]];
  26. if(num)return inv[deep]+query(ch[now][!o],ch[pre][!o],x,deep-);
  27. else return query(ch[now][o],ch[pre][o],x,deep-);
  28. }
  29. }tr;
  30. struct node{
  31. int pos,val,tim;
  32. bool operator <(const node &b)const{return pos<b.pos;}
  33. }co[N],q1[N],q2[N];
  34. struct nod{int l,r,x,st,en;}q[N];
  35. void calc(int cnt,int l,int r){
  36. int top=;tot=;
  37. for(int i=l;i<=r;++i){
  38. ++top;
  39. tr.ins(T[top],T[top-],co[i].val,len);
  40. }
  41. for(int i=;i<vec[cnt].size();++i){
  42. int id=vec[cnt][i];node x;
  43. x.pos=q[id].l-;
  44. int L=upper_bound(co+l,co+r+,x)-co-l;//!!!!
  45. x.pos=q[id].r;
  46. int R=upper_bound(co+l,co+r+,x)-co-l;
  47. ans[id]=max(ans[id],tr.query(T[R],T[L],q[id].x,len));
  48. }
  49. }
  50. void upd(int cnt,int l,int r,int L,int R,int x){
  51. if(L>R)return;
  52. if(l>=L&&r<=R){vec[cnt].push_back(x);return;}
  53. int mid=(l+r)>>;
  54. if(mid>=L)upd(cnt<<,l,mid,L,R,x);
  55. if(mid<R)upd(cnt<<|,mid+,r,L,R,x);
  56. }
  57. void solve(int cnt,int l,int r,int L,int R){
  58. if(l>r||L>R)return;
  59. int mid=(l+r)>>;
  60. calc(cnt,L,R);
  61. int o=,p=;
  62. for(int i=L;i<=R;++i){
  63. if(co[i].tim<=mid)q1[++o]=co[i];
  64. else q2[++p]=co[i];
  65. }
  66. for(int i=;i<=o;++i)co[L+i-]=q1[i];
  67. for(int i=;i<=p;++i)co[L+o+i-]=q2[i];
  68. if(l!=r)solve(cnt<<,l,mid,L,L+o-);
  69. solve(cnt<<|,mid+,r,L+o,R);
  70. }
  71. int main(){
  72. n=rd();m=rd();int l,r,x,d,v,opt;
  73. for(int i=;i<=n;++i)x=rd(),tr.ins(T[i],T[i-],x,len);
  74. inv[]=;
  75. for(int i=;i<=len;++i)inv[i]=inv[i-]<<;
  76. for(int i=;i<=m;++i){
  77. opt=rd();
  78. if(opt){
  79. l=rd();r=rd();x=rd();d=rd();
  80. q[++top]=nod{l,r,x,max(,tim-d+),tim};
  81. ans[top]=tr.query(T[r],T[l-],x,len);
  82. }
  83. else{
  84. tim++;x=rd();v=rd();co[tim]=node{x,v,tim};
  85. }
  86. }
  87. sort(co+,co+tim+);
  88. for(int i=;i<=top;++i)upd(,,tim,q[i].st,q[i].en,i);
  89. solve(,,tim,,tim);
  90. for(int i=;i<=top;++i)printf("%d\n",ans[i]);
  91. return ;
  92. }

[FJOI2015]火星商店问题(分治+可持久化)的更多相关文章

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

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

  2. [FJOI2015]火星商店问题

    [FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ...

  3. 【LG4585】[FJOI2015]火星商店问题

    [LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...

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

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

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

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

  6. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

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

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

  8. bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】

    其实我不太清楚这个应该叫CDQ分治还是整体二分 参考:http://blog.csdn.net/lvzelong2014/article/details/78688727 一眼做法是线段树套可持久化t ...

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

    重新写一年前抄题解的那题,当时我啥都不会只是Ctrl+C,Ctrl+V写过的题,今天重新写一遍. 题解: 不会线段树分治,还是学一下这东西吧,这是我的第一道线段树分治. 首先对于特殊商品,可以直接可持 ...

随机推荐

  1. Docker : Tomcat Clustering with Load Balancer (Tomcat and Nginx)

    Tomcat Clustering Series Part 5 : NginX as Load Balancer - Ramki Technical Bloghttps://www.ramkitech ...

  2. css行内省略号、垂直居中

    应用场景分析: 一.当你的文字限定行数,超出部分的文字用省略号显示. (有两个使用场景:1.单行 2.多行) // 单行 overflow: hidden; text-overflow:ellipsi ...

  3. Spring Boot+Jsp启动异常

    No Java compiler available for configuration options compilerClassName 加入maven配置 <dependency> ...

  4. 介绍Ajax与jQuery技术

    Ajxs技术(异步的JavaScript与XML)已有多种技术的组合 Ajax的优点是什么? 1.可以实现客户端的异步请求操作2.进而在不需要刷新页面的情况下与服务器进行通信,减少用户的等待时间3.减 ...

  5. linux安装php7.2.7

    1.下载php 官网下载:#wget http://cn2.php.net/get/php-7.2.7.tar.gz/from/a/mirror.(ps:应该是这么下载的,但是我下载的都是一个mirr ...

  6. 记一次ntp反射放大ddos攻击

    2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...

  7. windows 10 & 禁用服务.bat

    windows 10 & 禁用服务.bat 禁用服务.bat @echo off net stop WSearch net stop wuauserv net start TrustedIns ...

  8. 相识mongodb

    1.下载完安装包,并解压下载地址:https://www.mongodb.org/dl/linux/x86_64或者可以直接wget http://fastdl.mongodb.org/linux/m ...

  9. vue ajax

    局部get: this.$http.get(url,{param:jsonData}).then(successCallback,failCallBack) 局部post: this.$http.po ...

  10. How to remove unwant Explorer Context Menu

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell