题目描述

火星上的一条商业街里按照商店的编号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,复杂度是对的。

代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 210002
using namespace std;
vector<int>vec[N<<];
int len=,tot,inv[],T[N],ans[N],n,m,tim,top;
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
struct TRIE{
int ch[N*][],size[N*];
inline void ins(int &now,int pre,int x,int deep){
now=++tot;ch[now][]=ch[pre][];ch[now][]=ch[pre][];size[now]=size[pre]+;
if(deep<)return;
if(x&(<<deep))ins(ch[now][],ch[pre][],x,deep-);
else ins(ch[now][],ch[pre][],x,deep-);
}
inline int query(int now,int pre,int x,int deep){
if(deep<)return ;
int o=(x&(<<deep))!=,num=size[ch[now][!o]]-size[ch[pre][!o]];
if(num)return inv[deep]+query(ch[now][!o],ch[pre][!o],x,deep-);
else return query(ch[now][o],ch[pre][o],x,deep-);
}
}tr;
struct node{
int pos,val,tim;
bool operator <(const node &b)const{return pos<b.pos;}
}co[N],q1[N],q2[N];
struct nod{int l,r,x,st,en;}q[N];
void calc(int cnt,int l,int r){
int top=;tot=;
for(int i=l;i<=r;++i){
++top;
tr.ins(T[top],T[top-],co[i].val,len);
}
for(int i=;i<vec[cnt].size();++i){
int id=vec[cnt][i];node x;
x.pos=q[id].l-;
int L=upper_bound(co+l,co+r+,x)-co-l;//!!!!
x.pos=q[id].r;
int R=upper_bound(co+l,co+r+,x)-co-l;
ans[id]=max(ans[id],tr.query(T[R],T[L],q[id].x,len));
}
}
void upd(int cnt,int l,int r,int L,int R,int x){
if(L>R)return;
if(l>=L&&r<=R){vec[cnt].push_back(x);return;}
int mid=(l+r)>>;
if(mid>=L)upd(cnt<<,l,mid,L,R,x);
if(mid<R)upd(cnt<<|,mid+,r,L,R,x);
}
void solve(int cnt,int l,int r,int L,int R){
if(l>r||L>R)return;
int mid=(l+r)>>;
calc(cnt,L,R);
int o=,p=;
for(int i=L;i<=R;++i){
if(co[i].tim<=mid)q1[++o]=co[i];
else q2[++p]=co[i];
}
for(int i=;i<=o;++i)co[L+i-]=q1[i];
for(int i=;i<=p;++i)co[L+o+i-]=q2[i];
if(l!=r)solve(cnt<<,l,mid,L,L+o-);
solve(cnt<<|,mid+,r,L+o,R);
}
int main(){
n=rd();m=rd();int l,r,x,d,v,opt;
for(int i=;i<=n;++i)x=rd(),tr.ins(T[i],T[i-],x,len);
inv[]=;
for(int i=;i<=len;++i)inv[i]=inv[i-]<<;
for(int i=;i<=m;++i){
opt=rd();
if(opt){
l=rd();r=rd();x=rd();d=rd();
q[++top]=nod{l,r,x,max(,tim-d+),tim};
ans[top]=tr.query(T[r],T[l-],x,len);
}
else{
tim++;x=rd();v=rd();co[tim]=node{x,v,tim};
}
}
sort(co+,co+tim+);
for(int i=;i<=top;++i)upd(,,tim,q[i].st,q[i].en,i);
solve(,,tim,,tim);
for(int i=;i<=top;++i)printf("%d\n",ans[i]);
return ;
}

[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. 阿里云CodePipeline vs Jenkins

    产品概述_产品简介_CodePipeline-阿里云 https://help.aliyun.com/document_detail/56512.html CodePipeline管理控制台https ...

  2. .net WCF WF4.5

    花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...

  3. withRouter使用

    import React from 'react'; import {Switch,NavLink,Route,Redirect,withRouter} from 'react-router-dom' ...

  4. 10 Comparisons with adjectvies and nouns

    1 比较级用来比较两个词条之间的关系,比较级是通过在形容词后加 er 或者在形容词之前加 more 构成. 它的反义句是通过在形容词前加 less 或者 not as构成. Perfume sales ...

  5. CPU Cache 机制以及 Cache miss

    CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...

  6. 爬虫 之Requests库的详细使用

    1.什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约我 ...

  7. Kettle中表输出字段和字段选择

    表输出: 字段选择: 注:字段选择可以输出匹配后的选中列,表输出则输出匹配后的所有列.

  8. list类型功能剖析

    append  向后追加 name_list=["eirc","alex","tony"] name_list.append('seven' ...

  9. linux 安装python 和pip

    下载文件 python官网:https://www.python.org/downloads/ 百度网盘http://pan.baidu.com/s/1mixGB12     密码   9nzu [r ...

  10. 转 JQuery:常用方法一览

    出处 :http://www.cnblogs.com/Fooo/archive/2010/02/01/1661157.html 代码 Attribute:$(”p”).addClass(css中定义的 ...