洛谷 P4585 [FJOI2015]火星商店问题
(勿看,仅作笔记)
bzoj权限题。。。
https://www.luogu.org/problemnew/show/P4585
对于特殊商品,直接可持久化trie处理一下即可
剩下的,想了一段时间cdq,但是没想出来。。。应该是不行的
事实上,如果询问的不是最大值,而是一些满足[l,r]的答案等于[1,r]的答案-[1,l-1]的答案的东西,那么的确可以每个询问拆成两个直接cdq。。。
但是这题就不能。。不过可以线段树分治,这是基于[l,r]的答案可以被分成多个线段树上区间(这些区间的并等于[l,r])的答案的最大值(要对时间分治,[l,r]指对于某个询问合法的时间区间)
此题应该也可以线段树套可持久化trie做,但是最大的问题是垃圾回收。。。估计要写基于引用计数的垃圾回收?或者根本写不了?但是用分治的话只要每次solve之后把这次solve中用到的点全部回收掉就行了
跟题解学了个技巧:把询问和修改分开放进两个数组,方便处理
貌似那个vector也是可以去掉的,常数可以变小
使用vector是因为一个区间询问可能同时被分进两个子区间
那么只要处理出应该被分进左子区间的,然后solve左子区间,然后处理出应该被分进右子区间的,然后solve右子区间就行了;不一定要同时把应该分进左右子区间的处理出来
曾经错误:空间只算了后面solve部分所用字典树的空间,无视了特殊商品所占用的空间
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<map>
#define pb push_back
using namespace std;
namespace T
{
const int l2n=;
int lft[];
int sz[],ch[][];
int x;
int st[],top;
void init()
{
int i;lft[]=;
for(i=;i<=l2n;i++) lft[i]=lft[i-]<<;
for(i=;i<;i++) st[++top]=i;
}
int getnode()
{
int t=st[top--];sz[t]=ch[t][]=ch[t][]=;
return t;
}
void delnode(int x) {st[++top]=x;}
inline void cp(int &num)
{
int t=num;num=getnode();sz[num]=sz[t];ch[num][]=ch[t][];ch[num][]=ch[t][];
}
void _ins(int p,int &num)
{
cp(num);sz[num]++;
if(p>=) _ins(p-,ch[num][!!(x&lft[p])]);
}
void ins(int d,int &num) {x=d;_ins(l2n-,num);}
int que(int x,int r1,int r2)
{
int ans=,i;bool t;
for(i=l2n-;i>=;i--)
{
t=x&lft[i];
if(sz[ch[r2][!t]]-sz[ch[r1][!t]]) ans|=lft[i],r2=ch[r2][!t],r1=ch[r1][!t];
else r2=ch[r2][t],r1=ch[r1][t];
}
return ans;
}
}
int n,m;
int rt[];
int ans[];
struct Q
{
bool type;
int L,R,x,l,r,num;
};
bool c1(const Q &a,const Q &b) {return a.L<b.L;}
vector<Q> qq0,qq1;
void solve(const vector<Q> &q,const vector<Q> &c,int l,int r)
{
int i;
int qz=q.size(),cz=c.size();
map<int,int> rtt;rtt[]=;int rt1,rt2=,tmem=T::top;
for(i=;i<cz;i++)
{
T::ins(c[i].x,rt2);rtt[c[i].L]=rt2;
}
for(i=;i<qz;i++)
{
if(q[i].l<=l&&r<=q[i].r)
{
rt1=(--rtt.upper_bound(q[i].L-))->second;
rt2=(--rtt.upper_bound(q[i].R))->second;
ans[q[i].num]=max(ans[q[i].num],T::que(q[i].x,rt1,rt2));
}
}
T::top=tmem;
if(l==r) return;
int mid=l+(r-l)/;vector<Q> q1,q2,c1,c2;
for(i=;i<qz;i++)
{
if(!(q[i].l<=l&&r<=q[i].r))
{
if(q[i].l<=mid) q1.pb(q[i]);
if(mid<q[i].r) q2.pb(q[i]);
}
}
for(i=;i<cz;i++)
{
if(c[i].l<=mid) c1.pb(c[i]);
else c2.pb(c[i]);
}
solve(q1,c1,l,mid);
solve(q2,c2,mid+,r);
}
bool type[];
int main()
{
int i,t,a,b,c,d,idx,dd=;
T::init();
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
{
scanf("%d",&t);
rt[i]=rt[i-];T::ins(t,rt[i]);
}
for(i=;i<=m;i++)
{
scanf("%d",&idx);
if(idx==)
{
scanf("%d%d",&a,&b);
qq1.pb((Q){,a,,b,++dd,,i});
}
else
{
type[i]=;
scanf("%d%d%d%d",&a,&b,&c,&d);
ans[i]=T::que(c,rt[a-],rt[b]);
if(d!=) qq0.pb((Q){,a,b,c,max(,dd-d+),dd,i});
}
}
sort(qq1.begin(),qq1.end(),c1);
solve(qq0,qq1,,dd);
for(i=;i<=m;i++)
if(type[i])
printf("%d\n",ans[i]);
return ;
}
洛谷 P4585 [FJOI2015]火星商店问题的更多相关文章
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- [洛谷P4585] [FJOI2015] 火星商店问题
Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- 【洛谷】P4585 [FJOI2015]火星商店问题
题解 题目太丧,OJ太没有良心,我永远喜欢LOJ! (TLE报成RE,垃圾洛谷,我永远喜欢LOJ) 好的,平复一下我debug了一上午崩溃的心态= =,写一写这道题的题解 把所有限制去掉,给出一个值, ...
- Luogu P4585 [FJOI2015]火星商店问题
颓文化课作业到很晚写篇博客清醒一下 首先我们仔细阅读并猜测了题意之后,就会想到一个暴力的线段树套可持久化0/1Trie的做法,但是它显然是过不去的 由于最近再做线段树分治的题,我们可以想到用线段树分治 ...
- [FJOI2015]火星商店问题
[FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ...
- 【LG4585】[FJOI2015]火星商店问题
[LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
随机推荐
- 2016/05/25 抽象类与API(接口)差别
简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的 ...
- ALVtree 显示BOM结构
REPORT z_barry_alv_tree1_bom MESSAGE-ID oo. TABLES: stpox.INCLUDE <icon>. CLASS: cl_gui_col ...
- 关于animate的一些属性
animate() 方法执行 CSS 属性集的自定义动画.该方法通过CSS样式将元素从一个状态改变为另一个状态.CSS属性值是逐渐改变的,这样就可以创建动画效果.只有数字值可创建动画(比如 " ...
- js实现网页多少秒后自动跳转到指定网址
在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: ...
- 包、修饰符、内部类、匿名内部类(java基础知识十)
1.package关键字的概述及作用 * A:为什么要有包 * 将字节码(.class)进行分类存放 * B:包的概述 * * C:包的作用 * 包名要定义在第一行, ...
- 通过Oracle sql developer从sqlserver迁移数据到oracle
通过Oracle sql developer工具从sqlserver迁移数据到oracle 序言 一般情况下,sqlserver数据迁移到oracle,我们可以使用ODI来进行.但ODI的安装.配置. ...
- Bootstrap-CSS:按钮
ylbtech-Bootstrap-CSS:按钮 1.返回顶部 1. Bootstrap 按钮 本章将通过实例讲解如何使用 Bootstrap 按钮.任何带有 class .btn 的元素都会继承圆角 ...
- vue 随笔3
在整个vue项目中index.js只能有一个 ,创建vue组件实例的代码只能写在main.js中或者index.js中,别的文件中都是使用export default 常量 或者是方法
- margin---bug
常见的浏览器下margin出现的bug IE6中双边距Bug:发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:ri ...
- bzoj4547
矩阵乘法 看成了合并果子... 就是斐波那契数列,只是有负数的时候,先把负数变成正的,然后矩乘 矩乘还是用单位举矩阵记录快速幂的矩阵比较保险 #include<cstdio> #inclu ...