其实我不太清楚这个应该叫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. mysql 时间类型datetime与timestamp区别比较

    mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...

  2. PHP 基础复习 2018-06-17

    (1)AJAX Asynchronous JavaScript And XML(异步 JavaScript 及 XML) (2)创建 XMLHttpRequest 对象 不同的浏览器使用不同的方法来创 ...

  3. python之-- 反射

    反射定义:通过字符串映射或者修改程序运行时的状态,属性,方法.方法有如下4个:1:getattr(object,name,default=None):根据字符串去获取obj对象里的对应的方法的内存地址 ...

  4. Codeforces 659B Qualifying Contest【模拟,读题】

    写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...

  5. Web.config的system.webServer节点与system.web的区别

    Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...

  6. windows安装ZIP压缩版的Weblogic Server

    以前要装Weblogic Server的时候都是装的安装版,最近发现ZIP版本的Weblogic Server是一个只包含Weblogic Server的版本,于是就想着弄一下它. 这里用到的Webl ...

  7. 百亿级企业级 RPC 框架开源了!

    今天给大家介绍给一款性能卓越的 RPC 开源框架,其作者就是我推荐每个 Java 程序员都应该看的<Java 生态核心知识点整理>的原作者张玉龙. 说实话我第一次看到这个资料的时候,就感觉 ...

  8. libpython2.7.so.1.0: cannot open shared object file: No such file or directory

    解决方法如下: 1.编辑      vi /etc/ld.so.conf  如果是非root权限帐号登录,使用 sudo vi /etc/ld.so.conf  添加上python2.7的lib库地址 ...

  9. Oracle APEX 4.2安装和配置

    A standard Oracle 11.2.0.3 database installation comes bundled with Application Express (APEX) 3.2.1 ...

  10. 我所写的CNN框架 VS caffe

    我所写的CNN框架 VS caffe 一个月前.自己模仿caffe实现了一个卷积神经网络的框架. 同样点 1无缝支持CPU和GPU模式,GPU模式使用cuda实现. 不同点 1我的CNN不依赖与不论什 ...