bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】
其实我不太清楚这个应该叫CDQ分治还是整体二分
参考:http://blog.csdn.net/lvzelong2014/article/details/78688727
一眼做法是线段树套可持久化trie,但是会MLE+TLE
考虑用CDQ推掉线段树
首先对于没有时间限制的商品建一棵可持久化trie,先更新一遍ans。
然后对于询问和修改分别处理,多记录一维时间,把修改操作按照商店编号排序,对于询问操作的d,改为在时间维度上的一段区间[s,t]
对时间维进行二分,模拟线段树操作。
第一步,对于当前区间[L,R]进行处理。
第二步,枚举所有可能属于当前区间的询问,如果该询问包含本区间,用本区间处理后的答案更新这个询问的答案。
第三步,还原处理数据。
第四步,分治,取mid=L+R>>1,如果某个询问和[L,mid]有交集,那么把这些询问放到询问队列中递归解决左区间。然后再把和[mid+1,R]有交集的询问入队列,递归解决右区间即可。
写了三天,写完我整个人都分治了。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
int n,m,rt[N],tot,nt,num[N],a[N],dy,ans[N],gc,qc,id[N],d[N],dt;
struct qwe
{
int c[2],sum;
}t[N*32];
struct wen
{
int l,r,x,d,s,t;
}q[N];
struct gai
{
int s,v,t;
}g[N],tmpl[N],tmpr[N];
bool cmp(const gai &a,const gai &b)
{
return a.s<b.s;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int zhao(int x)
{
int l=1,r=nt,re=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(num[mid]<=x)
re=mid,l=mid+1;
else
r=mid-1;
}
return re;
}
void update(int &ro,int pr,int v)
{
ro=++tot;
int x=ro;
for(int i=17;i>=0;i--)
{
t[x].sum=t[pr].sum+1;
t[x].c[0]=t[pr].c[0];
t[x].c[1]=t[pr].c[1];
int d=(v&(1<<i))>>i;
t[x].c[d]=++tot;
x=t[x].c[d];
pr=t[pr].c[d];
}
t[x].sum=t[pr].sum+1;
}
int ques(int l,int r,int v)
{
if(l>r)
return 0;
int re=0;
for(int i=17;i>=0;i--)
{
int d=(v&(1<<i))>>i;
if(t[t[r].c[d^1]].sum-t[t[l].c[d^1]].sum)
{
re+=(1<<i);
l=t[l].c[d^1];
r=t[r].c[d^1];
}
else
{
l=t[l].c[d];
r=t[r].c[d];
}
}
return re;
}
void wk(int ml,int mr)
{
tot=0,nt=0;
for(int i=ml;i<=mr;i++)
{
nt++;
update(rt[nt],rt[nt-1],g[i].v);
num[nt]=g[i].s;
}
for(int i=1;i<=dt;i++)
{
int l=zhao(q[d[i]].l-1),r=zhao(q[d[i]].r);
ans[d[i]]=max(ans[d[i]],ques(rt[l],rt[r],q[d[i]].x));
}
}
void cdq(int gl,int gr,int tl,int tr,int w)
{
if(gl>gr||!w)
return;
int mid=(tl+tr)>>1;
dt=0;
for(int i=1;i<=w;i++)
if(q[id[i]].s<=tl&&q[id[i]].t>=tr)
d[++dt]=id[i];
wk(gl,gr);
int lt=0,rt=0;
for(int i=gl;i<=gr;i++)
{
if(g[i].t<=mid)
tmpl[lt++]=g[i];
else
tmpr[rt++]=g[i];
}
for(int i=0;i<lt;i++)
g[i+gl]=tmpl[i];
for(int i=0;i<rt;i++)
g[i+gl+lt]=tmpr[i];
if(tl==tr)
return;
int idt=0;
for(int i=1;i<=w;i++)
if((q[id[i]].s>tl||q[id[i]].t<tr)&&q[id[i]].s<=mid)
swap(id[i],id[++idt]);
cdq(gl,gl+lt-1,tl,mid,idt);
idt=0;
for(int i=1;i<=w;i++)
if((q[id[i]].s>tl||q[id[i]].t<tr)&&q[id[i]].t>mid)
swap(id[i],id[++idt]);
cdq(gl+lt,gr,mid+1,tr,idt);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
update(rt[i],rt[i-1],a[i]);
}
for(int i=1;i<=m;i++)
{
int o=read();
if(!o)
{
g[++gc].t=++dy;
g[gc].s=read(),g[gc].v=read();
}
else
{
q[++qc].l=read(),q[qc].r=read(),q[qc].x=read();
int d=read();
q[qc].s=max(dy-d,0)+1;
q[qc].t=dy;
ans[qc]=ques(rt[q[qc].l-1],rt[q[qc].r],q[qc].x);
}
}
sort(g+1,g+1+gc,cmp);
for(int i=1;i<=qc;i++)
id[i]=i;
cdq(1,gc,1,dy,qc);
for(int i=1;i<=qc;i++)
printf("%d\n",ans[i]);
return 0;
}
bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】的更多相关文章
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【LG4585】[FJOI2015]火星商店问题
[LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...
- [FJOI2015]火星商店问题
[FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- [FJOI2015]火星商店问题(分治+可持久化)
题目描述 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能与已 ...
- 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)
点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...
随机推荐
- Xcode warning: code will never be executed.
在xcode编译的时候,提示了code will never be executed这个警告.百度了一下,大体的意思是,该代码永远不会执行的意思. 比如: - (void)setMyStyle:(Ad ...
- mysql写入数据乱码问题的解决
mysql默认编码为latin. 我的mysql版本为5.6.安装路径下没有my.ini,但是有my-default.ini.其实mysql没有配置文件也是可以启动的,但是为了设置编码,需要将my-d ...
- Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)
用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...
- Python中暂未解决的问题
编写一个复杂的计算器,可以在通过GUI输出出来.参考代码http://www.cnblogs.com/BeginMan/p/3216093.html shelve模块中open()函数调用文件文件的路 ...
- Oracle 模糊查询方法
在这个信息量剧增的时代,怎样帮助用户从海量数据中检索到想要的数据.模糊查询是不可缺少的. 那么在Oracle中模糊查询是怎样实现的呢? 一.我们能够在where子句中使用likeke ...
- Javascript调试命令
Javascript调试命令——你只会Console.log() ? Console 对象提供对浏览器控制台的接入(如:Firefox 的 Web Console).不同浏览器上它的工作方式是不一样的 ...
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
()post http://04101334.iteye.com/blog/637695/ ()get function serializeElement(element) { var method ...
- SSH三大框架整合配置详细步骤(1)
配置Struts2.0 3.1 基础配置 1)引入Struts必需的五个jar包.下载struts-2.1.6-all.zip解压后,struts-2.1.6\lib目录下是struts所有的相关ja ...
- Speech Recognition Grammar Specification Version 1.0 JavaScript TTS 文本发音
Speech Recognition Grammar Specification Version 1.0 https://www.w3.org/TR/speech-grammar/ W3C Recom ...
- 借助ltp 逐步程序化实现规则库 文本生成引擎基于规则库和业务词库 去生成文本
[哪个地方做什么的哪家靠谱?地名词库行业.业务词库]苏州做网络推广的公司哪家靠谱?苏州镭射机维修哪家最专业?昆山做账的公司哪家比较好广州称重灌装机生产厂家哪家口碑比较好 [含有专家知识]郑州律师哪个好 ...