[BZOJ4137]火星商店问题
Description
Input
Output
Sample Input
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
0
2
5
HINT
Source
#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]火星商店问题的更多相关文章
- 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)
[BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...
- [FJOI2015]火星商店问题
[FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ...
- 【LG4585】[FJOI2015]火星商店问题
[LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题
https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ...
- 【bzoj4137】[FJOI2015]火星商店问题
*题目描述: 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能 ...
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...
随机推荐
- Hibernate的时间戳缓存区域
时间戳:一个详细到秒的时间点,就是一个时分秒的字符串 时间戳缓存区域存放了对于查询结果相关的表进行插入, 更新或删除操作的时间戳. Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期 ...
- SVN备份及恢复
一,SVN备份 svnadmin dump /data/svn/blzfmima/ > /tmp/full.svn.bak 其中/data/svn/blzfmima/为svn文件夹,导出成一个备 ...
- MapReduce学习笔记
一.MapReduce概述 MapReduce 是 Hadoop 的核心组成, 是专用于进行数据计算的,是一种分布式计算模型.由Google提出,主要用于搜索领域,解决海量数据的计算问题. MapRe ...
- 【HTML5 localStorage本地储存】简介&基本语法
了解localStorage localStorage是最新的HTML5中的新技术,它主要是用于本地储存.最近看了看localStorage,发现比cookie好多用了,还比cookie简单多了.于是 ...
- python学习笔记(二十四)继承与封装
继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...
- python学习笔记(二十三)私有方法和私有属性
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Person类的定义来看,外部代码还是可以自由地修改一个实例的nam ...
- genymotion——在虚拟机中当中安装genymotion,启动已经新增好的设备时,提示:the virtual device got no ip address
1.启动已经新增好的设备时,提示:the virtual device got no ip address,于是在网上搜索该问题,便得到提示,先启动virtual box中的该模拟设备,于是便启动,出 ...
- Redis操作手册
一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...
- 字符串的partition函数
partition函数 str1='sdga2a34'aa=str1.partition('a') print(aa) """ ('sdg', 'a', '2a34') ...
- Linux系统——本地定制化yum仓库部署
1)开启yum仓库配置文件 /etc/yum.conf的keepcache功能 (开启一个新的虚拟机) 将keepcache=0改为1,修改配置文件后重新清空缓存(1默认下载的安装包不删除,才可以实现 ...