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\) ...
随机推荐
- mysql 时间类型datetime与timestamp区别比较
mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...
- PHP 基础复习 2018-06-17
(1)AJAX Asynchronous JavaScript And XML(异步 JavaScript 及 XML) (2)创建 XMLHttpRequest 对象 不同的浏览器使用不同的方法来创 ...
- python之-- 反射
反射定义:通过字符串映射或者修改程序运行时的状态,属性,方法.方法有如下4个:1:getattr(object,name,default=None):根据字符串去获取obj对象里的对应的方法的内存地址 ...
- Codeforces 659B Qualifying Contest【模拟,读题】
写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...
- Web.config的system.webServer节点与system.web的区别
Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...
- windows安装ZIP压缩版的Weblogic Server
以前要装Weblogic Server的时候都是装的安装版,最近发现ZIP版本的Weblogic Server是一个只包含Weblogic Server的版本,于是就想着弄一下它. 这里用到的Webl ...
- 百亿级企业级 RPC 框架开源了!
今天给大家介绍给一款性能卓越的 RPC 开源框架,其作者就是我推荐每个 Java 程序员都应该看的<Java 生态核心知识点整理>的原作者张玉龙. 说实话我第一次看到这个资料的时候,就感觉 ...
- 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库地址 ...
- Oracle APEX 4.2安装和配置
A standard Oracle 11.2.0.3 database installation comes bundled with Application Express (APEX) 3.2.1 ...
- 我所写的CNN框架 VS caffe
我所写的CNN框架 VS caffe 一个月前.自己模仿caffe实现了一个卷积神经网络的框架. 同样点 1无缝支持CPU和GPU模式,GPU模式使用cuda实现. 不同点 1我的CNN不依赖与不论什 ...