题意

显然商店编号的限制能用可持久化trie解决。

特殊的商品预先判掉就好了,现在只考虑普通的商品。

发现商品的时间是单点,询问时一段时间,于是将询问区间在线段树上拆成\(log\)个区间,分别放上该询问。

之后dfs整颗线段树,先计算当前节点上的询问,之后将商品按照出现时间是在中点左右分成两类递归。

code:

#include<bits/stdc++.h>
using namespace std;
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
const int maxn=1e5+10;
int n,m,cnt1,cnt2,tot,num;
int ans[maxn],root[maxn],cnt[maxn*40],a[maxn];
int trie[maxn*40][2];
struct Buy{int tim,x,k;}buy[maxn],tmp1[maxn],tmp2[maxn];
struct Query{int sl,sr,tl,tr,k;}qr[maxn];
vector<int>seg[maxn<<2];
inline bool cmp(Buy a,Buy b){return a.x<b.x;}
void insert(int pre,int& now,int t,int k)
{
now=++tot;
trie[now][0]=trie[pre][0];trie[now][1]=trie[pre][1];cnt[now]=cnt[pre]+1;
if(t<0)return;
int c=(k>>t)&1;
insert(trie[pre][c],trie[now][c],t-1,k);
}
int query(int pre,int now,int t,int k)
{
if(t<0)return 0;
int c=(k>>t)&1;
if(cnt[trie[now][c^1]]-cnt[trie[pre][c^1]])return (1<<t)|query(trie[pre][c^1],trie[now][c^1],t-1,k);
else return query(trie[pre][c],trie[now][c],t-1,k);
}
void change(int p,int l,int r,int ql,int qr,int id)
{
if(ql>qr)return;
if(l>=ql&&r<=qr){seg[p].push_back(id);return;}
int mid=(l+r)>>1;
if(ql<=mid)change(ls(p),l,mid,ql,qr,id);
if(qr>mid)change(rs(p),mid+1,r,ql,qr,id);
}
inline int find(int x)
{
int l=0,r=num,res;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]<=x)res=mid,l=mid+1;
else r=mid-1;
}
return res;
}
inline void calc(int p,int L,int R)
{
tot=num=0;
for(int i=L;i<=R;i++)
{
a[++num]=buy[i].x;
insert(root[num-1],root[num],18,buy[i].k);
}
for(unsigned int i=0;i<seg[p].size();i++)
{
int id=seg[p][i],l,r;
l=find(qr[id].sl-1),r=find(qr[id].sr);
ans[id]=max(ans[id],query(root[l],root[r],18,qr[id].k));
}
}
void solve(int p,int l,int r,int ql,int qr)
{
if(ql>qr)return;
calc(p,ql,qr);
if(l==r)return;
int mid=(l+r)>>1,cntl=0,cntr=0;
for(int i=ql;i<=qr;i++)
{
if(buy[i].tim<=mid)tmp1[++cntl]=buy[i];
else tmp2[++cntr]=buy[i];
}
for(int i=1;i<=cntl;i++)buy[ql+i-1]=tmp1[i];
for(int i=1;i<=cntr;i++)buy[ql+cntl+i-1]=tmp2[i];
solve(ls(p),l,mid,ql,ql+cntl-1);solve(rs(p),mid+1,r,ql+cntl,qr);
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
insert(root[i-1],root[i],18,x);
}
for(int i=1;i<=m;i++)
{
int op;scanf("%d",&op);
if(!op)
{
int x,k;scanf("%d%d",&x,&k);
cnt1++;buy[cnt1]=(Buy){cnt1,x,k};
}
else
{
int sl,sr,k,d;scanf("%d%d%d%d",&sl,&sr,&k,&d);
qr[++cnt2]=(Query){sl,sr,max(1,cnt1-d+1),cnt1,k};
ans[cnt2]=query(root[sl-1],root[sr],18,k);
}
}
for(int i=1;i<=cnt2;i++)change(1,1,cnt1,qr[i].tl,qr[i].tr,i);
sort(buy+1,buy+cnt1+1,cmp);
solve(1,1,cnt1,1,cnt1);
for(int i=1;i<=cnt2;i++)printf("%d\n",ans[i]);
return 0;
}

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

  1. [FJOI2015]火星商店问题

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

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

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

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

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

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

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

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

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

  6. [FJOI2015]火星商店问题(分治+可持久化)

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

  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. [洛谷P4585] [FJOI2015] 火星商店问题

    Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...

随机推荐

  1. MongoDB学习笔记(一、MongoDB入门)

    目录: 为什么要使用nosql mongo的简介 应用场景 入门demo 为什么要使用nosql: 随着互联网的发展,用户数量激增,访问量的上涨,传统的关系型数据库的性能也趋于瓶颈. 关系型数据库难以 ...

  2. shell基础、变量、相关脚本

    目录 一.shell基础 书写规范 引号 配置文件 read交互 脚本调式 小节总结 二.变量 变量类型 位置变量 状态变量 替换和删除 变量补充 变量运算 小节总结 三.相关脚本面试题 统计hist ...

  3. 创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值

    1.创建组件的方法   函数组件   class组件 1.1 函数组 无状态函数式组件形式上表现为一个只带有一个 `render()` 方法的组件类,通过函数形式或者 `ES6` 箭头 `functi ...

  4. JavaScript:ES6的新特性

    1.关键字 const:修饰常量.ES6之前只有变量的声明字段var,ES6开始引入常量关键字,被修饰的变量无法被修改. <script type="text/javascript&q ...

  5. Spring 中AOP及前后置增强案例

    1.AOP面向切面编程 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来.  1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等.  2主要意 ...

  6. Python ASCII码与字符相互转换

    ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和 ...

  7. ExtJS布局控件

    Layout Controls Auto Layout Ext JS4中的容器的默认布局是自动布局.这个布局管理器会自动地将组件放在一个容器中. Fit Layout Fit布局安排了容器的内容完全占 ...

  8. 使用os模块动态获取目录或文件路径

    在接口自动化测试框架中,我们的代码除了能在本地运行,也能在不在修改代码的前提下在其他的环境下能够运行,这样才能达到高复用性和低维护成本,我们在接口测试的模块调用中,会定义很多相关路径,而这些路径必须使 ...

  9. php捕获Fatal error错误与异常处理

    php中的错误和异常是两个不同的概念. 错误:是因为脚本的问题,比如少写了分号,调用未定义的函数,除0,等一些编译语法错误. 异常:是因为业务逻辑和流程,不符合预期情况,比如验证请求参数,不通过就用 ...

  10. 【CF241E】Flights(差分约束)

    [CF241E]Flights(差分约束) 题面 CF 有\(n\)个点\(m\)条边,要求给每条边赋一个\(1\)或\(2\)的边权,判断能否使得每一条\(1\)到\(n\)的路径的权值和都相等,如 ...