Description

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

Input

第1行中给出2个正整数n,m,分别表示商店总数和事件总数。 
第2行中有n个整数,第i个整数表示商店i的特殊商品标价。 
接下来的m行,每行表示1个事件。每天的事件按照先事件0,后事件1的顺序排列。 

Output

将计算出的每个事件1的val xor x的最大值依次输出。

Sample Input

4 6
1 2 3 4
1 1 4 1 0
0 1 4
0 1 3
1 1 1 1 0
1 1 1 1 1
1 1 2 1 2

Sample Output

5
0
2
5

HINT

n, m <= 100000
数据中,价格不大于100000

Source

显然呢这道题可以用线段树套可持久化$Trie$来实现,不过不是我们讨论的范围
我们考虑每个修改对询问的影响是一段区间
按时间建立线段树,那么每个询问对应了线段树不超过$logn$个节点,每次修改对应着从该时间点到根节点的路径
所以每个修改对$logn$个节点有贡献,因此我们在回答每个节点的询问前,直接暴力把对该节点有影响的修改插进线段树即可
因为询问被拆成了许多线段树节点,于是要对这些被拆的询问取$max$
代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#define M 100010
#define ls node<<1
#define rs node<<1|1
using namespace std; int n,m,cnt,cnt1,cnt2;
int rt[M],f[M],ans[M];
vector<int>seg[M<<];
struct CG{int s,v,t;}q[M],tmp1[M],tmp2[M];
struct ASK{int l,r,l1,r1,x;}p[M];
bool cmp(CG a1,CG a2) {return a1.s<a2.s;} struct Trie
{
int cnt;
int val[M<<],ch[M<<][];
void insert(int &now,int pre,int w,int o)
{ now=++cnt,val[now]=val[pre]+;
ch[now][]=ch[pre][];ch[now][]=ch[pre][];
if(o==-) return;bool c=w&(<<o);
insert(ch[now][c],ch[pre][c],w,o-);
}
int query(int now,int pre,int w,int o)
{
if(o==-) return ;
bool c=w&(<<o);
int tmp=val[ch[now][c^]]-val[ch[pre][c^]];
if(tmp) return query(ch[now][c^],ch[pre][c^],w,o-)+(<<o);
else return query(ch[now][c],ch[pre][c],w,o-);
}
}T; void insert(int node,int l,int r,int l1,int r1,int id)
{
if(l1>r1) return;
if(l1<=l&&r1>=r) {seg[node].push_back(id);return;}
int mid=(l+r)/;
if(l1<=mid) insert(ls,l,mid,l1,r1,id);
if(r1>mid) insert(rs,mid+,r,l1,r1,id);
} int get(int v)
{
int l=,r=cnt,ans=;
while(l<=r)
{
int mid=(l+r)/;
if(f[mid]<=v) ans=mid,l=mid+;
else r=mid-;
}
return ans;
} void cal(int node,int l,int r)
{
cnt=T.cnt=;
for(int i=l;i<=r;i++)
{
f[++cnt]=q[i].s;
T.insert(rt[cnt],rt[cnt-],q[i].v,);
}
for(int i=;i<seg[node].size();i++)
{
int id=seg[node][i];
int l=get(p[id].l-);
int r=get(p[id].r);
ans[id]=max(ans[id],T.query(rt[r],rt[l],p[id].x,));
}
} void solve(int node,int l,int r,int l1,int r1)
{
if(l1>r1) return;
cal(node,l,r);
if(l==r) return;
int mid=(l+r)/,t1=,t2=;
for(int i=l1;i<=r1;i++)
{
if(q[i].t<=mid) tmp1[++t1]=q[i];
else tmp2[++t2]=q[i];
}
for(int i=;i<=t1;i++) q[i+l1-]=tmp1[i];
for(int i=;i<=t2;i++) q[i+l1-+t1]=tmp2[i];
solve(ls,l,mid,l1,l1+t1-);
solve(rs,mid+,r,l1+t1,r1);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
T.insert(rt[i],rt[i-],x,);
}
for(int i=;i<=m;i++)
{
int opt;scanf("%d",&opt);
if(!opt)
{
int s,v;scanf("%d%d",&s,&v);
cnt1++;q[cnt1]=(CG){s,v,cnt1};
}
else
{
int l,r,x,d;scanf("%d%d%d%d",&l,&r,&x,&d);
ans[++cnt2]=T.query(rt[r],rt[l-],x,);
p[cnt2]=(ASK){l,r,max(,cnt1-d+),cnt1,x};
}
}
for(int i=;i<=cnt2;i++)
insert(,,cnt1,p[i].l1,p[i].r1,i);
sort(q+,q++cnt1,cmp);
solve(,,cnt1,,cnt1);
for(int i=;i<=cnt2;i++) printf("%d\n",ans[i]);
return ;
}

[BZOJ4137]火星商店问题的更多相关文章

  1. 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)

    [BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...

  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. [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)

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

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

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

  7. BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题

    https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ...

  8. 【bzoj4137】[FJOI2015]火星商店问题

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

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

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

随机推荐

  1. Morphia - mongodb之ORM框架

    一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...

  2. SOCKS5的出现缓解了各种具体协议需要专门设计代理协议的困难局面

    socks5_百度百科 https://baike.baidu.com/item/socks5/8915011?fr=aladdin 如果您的机器具有一个合法的 Internet IP 地址, 或者您 ...

  3. Put queue for MemoryTransaction of capacity 10000 full, consider committing more frequently, increasing capacity or increasing thread count flume capacity 时间数

    package com.test; import org.apache.http.*;import org.apache.http.entity.ContentType;import org.apac ...

  4. Spark源码分析 – Checkpoint

    CP的步骤 1. 首先如果RDD需要CP, 调用RDD.checkpoint()来mark 注释说了, 这个需要在Job被执行前被mark, 原因后面看, 并且最好选择persist这个RDD, 否则 ...

  5. hashCode和equals方法的区别与联系

    hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等: (1)equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比 ...

  6. centos7通过阿里云配置docker加速镜像

    针对Docker客户端版本大于1.10.0的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器: sudo mkdir -p /etc/docker s ...

  7. 兼容获取scrollTop和scrollLeft(被滚动条卷走的部分)

    function scroll() { //ie9+ 标准浏览器 if (window.pageYOffset != null) { return { left: window.pageXOffset ...

  8. linux下的KSM内存共享机制分析

    2017-04-26 KSM是内核中的一种内存共享机制,在2.6.36版本的内核中开始引入,简单来说就是其会 合并某些相同的页面以减少页面冗余.在内核中有一个KSM守护进程 ksmd,它定期扫描用户向 ...

  9. 【opencv入门篇】 10个程序快速上手opencv【上】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...

  10. My Neural Network isn't working! What should I do?

    参考文献:http://theorangeduck.com/page/neural-network-not-working 我的网络不起作用!该怎么办? 因此,你在深度学习方面正在开发下一个重大突破, ...