其实我不太清楚这个应该叫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】的更多相关文章

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

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

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

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

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

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

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

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

  5. [FJOI2015]火星商店问题

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

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

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

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

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

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

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

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

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

随机推荐

  1. tomcat启动提示java.lang.UnsatisfiedLinkError: D:\soft\devTool\apache-tomcat-7.0.57\bin\tcnative-1.dll: C

    https://blog.csdn.net/a274360781/article/details/52411984

  2. List排列组合

    /** * 步骤::每次递归时,把原始数据和满足条件的工作空间复制一份,所有的操作均在复制文件中进行,目的就是保证不破坏原始数据, * 从而可以让一轮递归结束后可以正常进行下一轮. * 其次,把数据的 ...

  3. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  4. Java生成验证码并进行验证(转)

    本文转自http://blog.csdn.net/worm0527/article/details/51030864 一.实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用 ...

  5. java File_encoding属性

    今天给客户发版本号,突然发现报表导出内容为空,大小0字节.感到很奇怪,由于开发的时候都好好的,打包出来怎么会出现异常. 细看才后发现是 file_encoding这个java系统属性编码方式设置导致的 ...

  6. Mybatis加入Ehcache支持

    1.Mybatis默认的缓存配置 MyBatis 包括一个很强大的查询缓存特性,它能够很方便地配置和定制. Mybatis缓存包括全局的缓存和局部的缓存.全局的缓存能够讲主配置文件的setting属性 ...

  7. 快看Sample代码,速学Swift语言(2)-基础介绍 快看Sample代码,速学Swift语言(1)-语法速览

    快看Sample代码,速学Swift语言(2)-基础介绍 Swift语言是一个新的编程语言,用于iOS, macOS, watchOS, 和 tvOS的开发,不过Swift很多部分内容,我们可以从C或 ...

  8. C#&.NET高级面试题

    转自http://chaoyouzhuo.blog.163.com/blog/static/1263760012011109114131316/ 1. DateTime.Parse(myString) ...

  9. udhcp源码详解(二)--转

    定义的数据结构对于C程序的重要性,不言而喻.面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合. 下面来分析的是dhcp server中的定义结构体: 1).在pa ...

  10. 手机阅读行业SWOT分析

    上个星期,在公司内部的分享活动上给童鞋们分享了手机阅读行业现状,小伙伴儿们嗷嗷待哺的眼神促使我把PPT转换为博客里的文字和图片,再一次更加深入地进入手机阅读. 通过SWOT分析分析我们能够对手机阅读行 ...