(勿看,仅作笔记)

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]火星商店问题的更多相关文章

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

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

  2. [洛谷P4585] [FJOI2015] 火星商店问题

    Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...

  3. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

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

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

  5. 【洛谷】P4585 [FJOI2015]火星商店问题

    题解 题目太丧,OJ太没有良心,我永远喜欢LOJ! (TLE报成RE,垃圾洛谷,我永远喜欢LOJ) 好的,平复一下我debug了一上午崩溃的心态= =,写一写这道题的题解 把所有限制去掉,给出一个值, ...

  6. Luogu P4585 [FJOI2015]火星商店问题

    颓文化课作业到很晚写篇博客清醒一下 首先我们仔细阅读并猜测了题意之后,就会想到一个暴力的线段树套可持久化0/1Trie的做法,但是它显然是过不去的 由于最近再做线段树分治的题,我们可以想到用线段树分治 ...

  7. [FJOI2015]火星商店问题

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

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

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

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

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

随机推荐

  1. openwrt 配置rsync服务

    一: rsyn简介 remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 “rsyn ...

  2. 怎样搭建svn本地server,管理本地的代码

    搭建svn本地server,以下是详细的步骤介绍. 一.准备工作 1.下载svnserver端:Subversion. 到官方站点(http://s version.tigris.org/)下载最新的 ...

  3. (org.openqa.selenium.WebDriverException: Unable to launch the app: Error: Trying to start logcat capture but it's already started! )错误解决办法

    新增: capabilities.setCapability("autoLaunch",false); 将setup中的: driver = new AndroidDriver(n ...

  4. npm WARN uninstall not installed in /Users/hrt0kmt/node_modules: "xxx"

    You may meet this error on home directory. % npm uninstall appium npm WARN uninstall not installed i ...

  5. Android的onMeasure方法

    在Android开发中,当Android原生控件不能满足我们的需求的时候,就需要自定义View.View在屏幕上绘制出来先要经过measure(计算)和layout(布局). 什么时候调用onMeas ...

  6. COGS28 [NOI2006] 最大获利[最大权闭合子图]

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  7. 用 querySelectorAll 来查询 DOM 节点

    用 querySelectorAll 来查询 DOM 节点 Document.querySelectorAll - Web API 接口 | MDN https://developer.mozilla ...

  8. Delphi之萝莉调教篇

    本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...

  9. 使用JavaScript获取浏览器Chrome版本信息

    Navigator对象包含了有关浏览器的信息 可通过访问其属性appVersion或userAgent来获取浏览器Chrome版本 例如,我所使用的QQ浏览器的appVersion和userAgent ...

  10. SpringMvc參数的接受以及serializeArray的使用方法

    需求:从页面提交一个table中的数据到后台,通经常使用于批量改动 把全部的数据到放到 input属性中,设置name定义成为对象的相关属性,使用Jquery的serializeArray这种方法封装 ...