[FJOI2015]火星商店问题(线段树分治+可持久化Trie)
重新写一年前抄题解的那题,当时我啥都不会只是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)的更多相关文章
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】
其实我不太清楚这个应该叫CDQ分治还是整体二分 参考:http://blog.csdn.net/lvzelong2014/article/details/78688727 一眼做法是线段树套可持久化t ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...
- 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)
点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...
随机推荐
- SQLmap自动注入工具命令(10.28 10.29 第二十八 二十九天)
SQL注入工具:明小子 啊D 萝卜头 sqlmap 等等 SQLMAP:开源的自动化诸如利用工具,支持的数据库有12中,在/plugins中可以看到支持的数据库种类,在所有注入利用工具中他 ...
- 二十三、JavaScript之html事件
一.代码如下 二.效果如下 三.点击之后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" ...
- 实验吧-杂项-flag.xls(notepad++查找)、保险箱(linux文件分解、密码破解)
flag.xls 下载文件,用notepad++打开,查找flag就能找到flag. 保险箱(linux文件分解.密码破解) 将图片保存下来,用kali的binwalk分析,发现有rar文件,然后用f ...
- PHP笔记02
PHP数组 能够在一个变量存储多个值 取值用下标,下标从0开始计算 好处:在处理物品清单等大量相同属性的变量内容时可以集中存取 <?php $arr=array("like" ...
- Elasticsearch 使用集群
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- 打包|zip
原始:gzip zip -r ./gzip.zip ./gzip/* adding: gzip/split_10.gz (deflated 2%) adding: gzip/split_11.gz ( ...
- LeetCode#3 - 无重复字符的最长字串(滑动窗口)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: abcabcbb 输出的结果应该是3,最长的无重复的字串是'abc' 果然无论做什么都要静下心来啊!昨晚上卡了一个多小 ...
- Windows操作系统安装JDK环境
Windows操作系统安装JDK环境 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. Java常见的术语 1>.什么是JVM 只要在需要运行Java应用程序的操作系统上 ...
- 【Android】家庭记账本手机版开发报告四
一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...
- POJ 3663:Costume Party
Costume Party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12607 Accepted: 4977 De ...