洛谷 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巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
 
随机推荐
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part II
			
A Tutorial on the Device Tree (Zynq) -- Part II 设备树结构 Zynq的设备树如下: /dts-v1/; / { #address-cells = < ...
 - SpringCloud遇到的坑
			
1. 今天使用Feign 调用其他项目,结果一直跳转到断路器,跟踪发现是接口响应时间较长,解决方案 解决:# 在 Feign 模块中,单独设置这个超时时间不行,还要额外设置 Ribbon 的超时时间, ...
 - 为什么java web项目中要使用spring
			
1 不使用spring的理由 spring太复杂,不利于调试. spring太复杂,不利于全面掌控代码. spring加载bean太慢. 等等. 2 对不使用spring理由的辩驳 spring io ...
 - 二阶段 三阶段  提交   Paxos
			
关于分布式事务.两阶段提交协议.三阶提交协议 - 文章 - 伯乐在线 http://blog.jobbole.com/95632/
 - Safair css hack
			
一下方式不会影响chrome浏览器样式 _::-webkit-full-page-media, _:future, :root .class{ /*此处放css样式*/ }
 - html5--6-5 CSS选择器2
			
html5--6-5 CSS选择器2 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作 ...
 - 【CQ18阶梯赛第二场】题解
			
[A-H国的身份证号码I] 用N个for语句可以搞定,但是写起来不方便,所以搜索. dfs(w,num,p)表示搜索完前w位,前面x组成的数位num,最后以为为p. 如果搜索到第N位,则表示num满足 ...
 - mongoDB的复制集5----复制集安全(认证,用户,权限)
			
一.什么是认证 如何开启认证 1).auth=true(在配置文件里增加) 2).keyFile(建议添加到配置文件里) #如果设置了auth=true,但第一次没有创建用户就启动实例怎 ...
 - Spring Data JPA 和MyBatis比较
			
现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者. Spring Data JPA 是Spring Data ...
 - centos6.5下忘记mysql密码
			
1.此方式会使得服务器处于不安全的情况,请尽量保证在安全的环境下进行,因为,此方式,会使得任何人任意地连接MySQL数据库. 2.#vim /etc/my.cnf 在[mysqld]的段中,加上ski ...