重新写一年前抄题解的那题,当时我啥都不会只是Ctrl+C,Ctrl+V写过的题,今天重新写一遍。

题解:

不会线段树分治,还是学一下这东西吧,这是我的第一道线段树分治。

首先对于特殊商品,可以直接可持久化Trie记录答案。首先考虑对每个线段树开一个vector,把询问的时间区间看成一段一段的塞到线段树里,修改实际上是相当于一个后缀。然后把修改按位置排序,然后仿照线段树的形式按时间分治,mid前的修改扔到左边数组里递归,反之扔到右边,这样能够排除这一维的限制。然后空间上用可持久化Trie,前缀和相减即可。最开始的修改,要按照商店顺序排序,这样可以把中间的商店忽略,一个修改挨着一个修改建主席树,复杂度得以保证。

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=1e5+;
struct guest{int l,r,L,R,x;}p[N];
struct buy{int s,v,t;}q[N],t1[N],t2[N];
int n,m,n1,n2,tot,top,rt[N],ans[N],st[N],ch[N*][],sz[N*];
vector<int>a[N];
bool cmp(buy x,buy y){return x.s<y.s;}
void build(int&x,int u,int S)
{
x=++tot;
int now=x;
for(int i=;~i;i--)
{
bool d=S>>i&;
ch[now][d^]=ch[u][d^],ch[now][d]=++tot;
now=ch[now][d],u=ch[u][d],sz[now]=sz[u]+;
}
}
int query(int l,int r,int S)
{
int ret=;
for(int i=;~i;i--)
{
bool d=S>>i&;
if(sz[ch[r][d^]]-sz[ch[l][d^]]>)l=ch[l][d^],r=ch[r][d^],ret+=<<i;
else l=ch[l][d],r=ch[r][d];
}
return ret;
}
void update(int L,int R,int x,int l,int r,int rt)
{
if(L>R)return;
if(L<=l&&r<=R){a[rt].push_back(x);return;}
int mid=l+r>>;
if(L<=mid)update(L,R,x,lson);
if(R>mid)update(L,R,x,rson);
}
void calc(int x,int L,int R)
{
top=tot=;
for(int i=L;i<=R;i++)st[++top]=q[i].s,build(rt[top],rt[top-],q[i].v);
for(int i=,k,l,r;i<a[x].size();i++)
{
k=a[x][i];
l=upper_bound(st+,st+top+,p[k].l-)-st-,r=upper_bound(st+,st++top,p[k].r)-st-;
ans[k]=max(ans[k],query(rt[l],rt[r],p[k].x));
}
}
void divide(int l,int r,int rt,int L,int R)
{
if(L>R)return;
int mid=l+r>>,cnt1=,cnt2=;
calc(rt,L,R);
if(l==r)return;
for(int i=L;i<=R;i++)if(q[i].t<=mid)t1[++cnt1]=q[i];else t2[++cnt2]=q[i];
for(int i=;i<=cnt1;i++)q[i+L-]=t1[i];
for(int i=;i<=cnt2;i++)q[i+L-+cnt1]=t2[i];
divide(lson,L,L+cnt1-);
divide(rson,L+cnt1,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x;i<=n;i++)scanf("%d",&x),build(rt[i],rt[i-],x);
for(int i=,op,l,r,x,d;i<=m;i++)
{
scanf("%d%d%d",&op,&l,&r);
if(!op)q[++n1]=(buy){l,r,n1};
else{
scanf("%d%d",&x,&d);
ans[++n2]=query(rt[l-],rt[r],x);
p[n2]=(guest){l,r,max(,n1-d+),n1,x};
}
}
for(int i=;i<=n2;i++)update(p[i].L,p[i].R,i,,n1,);
sort(q+,q+n1+,cmp);
divide(,n1,,,n1);
for(int i=;i<=n2;i++)printf("%d\n",ans[i]);
}

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

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

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

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

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  3. 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie

    感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...

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

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

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

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

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

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

  7. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

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

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

  9. 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)

    点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...

随机推荐

  1. 【LeetCode】反转字符串

    [问题] 编写一个函数,其作用是将输入的字符串反转过来. 示例 : 输入: "hello" 输出: "olleh" 示例 : 输入: "A man, ...

  2. Sublime Text3 python自动补全问题——Sublime Text3安装Anaconda插件

    学习python的时候 在编辑器的选择上会有很多选择,我最终还是选择了sublime text3. 相对于其他编辑器,sublime text有以下特性: 插件多,类似GoSublime,Emmet信 ...

  3. Vulkan 之 Layers

    Layers 暴露给api层,不像传统图形API集成在驱动里面,开发者根据自己的需要进行开启,最终目的还是为了提高性能. The Loader he loader is the central arb ...

  4. js加密(十四)mail.yw.gov.cn/ RSA

    1. url: http://mail.yw.gov.cn/ 2. target:登录js 3. 简单分析: 寻找加密js: 3.1 直接寻找加密的参数p是不好找的,所以我们试着去寻找一些更明显的参数 ...

  5. MacType

    #前言 这几天实在是嫌弃Win10垃圾的字体渲染效果--发虚模糊,索性从网上找了个系统字体渲染软件即MacType给系统字体改头换面. #使用效果 这里贴出两个场景的效果对比(单击图片查看具体效果) ...

  6. 留学Essay写作常见谬误盘点

    留学生在完成英语论文作业的时候总会出现各种各样的谬误,导致最后拿不到高分,甚至挂科,最终只得选择写作完成.本文小编为大家总结出我们留学生在essay写作中几个常见谬误,希望大家有则改之,无则加勉. E ...

  7. 干货分享:深度解析Supplement Essay写作

    今天Hotessay小编给同学们介绍下附加文书的创作思路.因为附加文书基本上都是短essay,所以简洁才是硬道理! 通常,我们可以把美国大学的附加文书分为以下几类: 1.Tell us about y ...

  8. 电影网站的电影m3u8源址分享(存储于mysql数据库,可直接应用在电影网站上使用)

    说明: 1.包含一个films.sql文件,基于mysql5.6的数据表导出文件. 2.该sql文件里面包含一个mysql数据表films,内含35000部电影m3u8源地址. 3.films数据表包 ...

  9. class(一)--类的创建

    class是ES6引入的,它并不是一种全新的继承模式,而只是基于原型对象继承封装的语法糖,因此只要充分理解原型对象,原型链,继承等知识,class也就很好容易理解了 类的声明 ES5及之前是通过创建一 ...

  10. kafka 相关命令 偏移重置

    kafka官方文档 https://kafka.apache.org/documentation.html#quickstart kafka 安装文档 https://www.jianshu.com/ ...