重新写一年前抄题解的那题,当时我啥都不会只是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. Python3 格式化输出

    Python3 格式化输出 今天用字符串功能的时候,我突然忘记了格式化输出的方式X﹏X.所以赶紧恶补一下. 1.打印字符串 print("My name is %s" %(&quo ...

  2. HihoCoder第九周 状态压缩 二 与POJ2411总结

    在此我向各位博友求助,特别想知道除了HihoCoder上面的结果要对1e9+7取余之外,这两道题还有什么其他的问题,都是骨牌覆盖问题,都是状态压缩+dp,为什么我能过poj2411的程序过不了Hiho ...

  3. eclipse 安装spring tools suite插件

    之前使用idea进行springboot项目的开发学习,但是由于idea是收费的,总是用着用着说验证码到期之类的,总之还是很不爽,于是就想重新采用eclipse开发springboot项目,为了方便s ...

  4. Nachos-Lab3-同步与互斥机制模块实现

    源码获取 https://github.com/icoty/nachos-3.4-Lab 内容一:总体概述 本实习希望通过修改Nachos系统平台的底层源代码,达到"扩展同步机制,实现同步互 ...

  5. 《方方格子》(WPS版) _v3.6.6.0

    <方方格子>(WPS版) 下载地址(b2a7) SHA1:35AE4D99B77613D9E2BAF912477DC74C5C2B8389 版本信息    发行版本 3.6.6.0    ...

  6. React 学习笔记(3) B站视频总结1

    视频地址 项目基础 react-cli // 项目结构 src │ App.js # 应用根组件 │ index.js # 入口js ├─api ├─assets ├─components ├─con ...

  7. 实验吧-密码学-变异凯撒(ascii码规律运算)

    密文是:afZ_r9VYfScOeO_UL^RWUc 刚开始很迷,不知道往什么方向,到最后才发现,原来和ASCII有关. 将flag{的ASCII码和密文的ASCII码对比: 97 102 90 95 ...

  8. getClass兼容ie

    if (!document.getElementsByClassName) { document.getElementsByClassName = function(className, elemen ...

  9. 【golang】golang文本处理

    golang文本字符串操作:包含 合并 连接 分割 取索引 前缀后缀检测 消除字符串 消除空格 golang字符串操作需要用到 strings这个包 str := "hello world& ...

  10. 关联容器--保存指针时要指定容器的比较类型---引用Effective STL

    无论何时你建立指针的关联容器,注意你也得指定容器的比较类型.大多数时候,你的比较类型只是解引用指针并比较所指向的对象(就像上面的StringPtrLess做的那样).鉴于这种情况,你手头最好也能有一个 ...