比较容易想到的做法是线段树套字典树,修改操作时在字典树上经过的节点维护一个最近被访问过的时间,这样询问操作只经过满足时间条件的节点,时间复杂度O(NlogN^2)但是因为线段树每个节点都要套个字典树,这样的话空间是不够的,不过由于可以离线处理,我们可以先把每个修改和询问操作所访问的线段树节点保存下来,然后一个个节点去做,这样的话空间复杂度就可以保证了。

代码

 #include<cstdio>
#include<set>
#include<vector>
#define N 1000010
#define M 10000010
using namespace std;
int l[N],r[N],n,m,i,a,typ,b,L,R,ti,ans[N],tot,p[N],cnt,flag;
int s[M][],t[M];
vector<pair<int,int> > vec[N];
vector<int> id[N];
void build(int x,int a,int b)
{
int m;
l[x]=a;r[x]=b;
if (b-a>)
{
m=(a+b)>>;
build(*x,a,m);
build(*x+,m,b);
}
}
void insert(int x,int a,int b,pair<int,int> c,int typ)
{
int m;
if (typ==)
{
vec[x].push_back(c);
id[x].push_back(typ);
}
if ((a<=l[x])&&(r[x]<=b))
{
if (typ)
{
vec[x].push_back(c);
id[x].push_back(typ);
}
return;
}
m=(l[x]+r[x])>>;
if (a<m) insert(*x,a,b,c,typ);
if (m<b) insert(*x+,a,b,c,typ);
}
void cl(int x)
{
int i;
for (i=;i<=;i++)
{
p[-i+]=x%;
x=x/;
}
}
void change(int x,int y)
{
int now,i;
cl(x);
now=;
for (i=;i<=;i++)
{
if (s[now][p[i]]==)
s[now][p[i]]=++tot;
now=s[now][p[i]];
t[now]=max(t[now],y);
}
}
int query(int x,int y)
{
int now,i,ans=;
cl(x);
now=;
for (i=;i<=;i++)
if ((s[now][-p[i]])&&(t[s[now][-p[i]]]>=y))
{
now=s[now][-p[i]];
ans=ans+(<<(-i));
}
else
now=s[now][p[i]];
return ans;
}
void gao(int x)
{
int i,a,b;
for (i=;i<=tot;i++)
s[i][]=s[i][]=t[i]=;
tot=;
for (i=;i<vec[x].size();i++)
{
a=vec[x][i].first;
b=vec[x][i].second;
if (id[x][i]==)
change(a,b);
else
ans[id[x][i]]=max(ans[id[x][i]],query(a,b));
}
if (r[x]-l[x]==)
return;
gao(*x);
gao(*x+);
}
int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for (i=;i<=n;i++)
{
scanf("%d",&a);
insert(,i-,i,make_pair(a,m+),);
}
ti=;
for (i=;i<=m;i++)
{
scanf("%d",&typ);
if (typ==)
{
scanf("%d%d%d%d",&L,&R,&a,&b);
insert(,L-,R,make_pair(a,ti-b+),++cnt);
}
else
{
ti++;
scanf("%d%d",&a,&b);
insert(,a-,a,make_pair(b,ti),);
}
}
gao();
for (i=;i<=cnt;i++)
printf("%d\n",ans[i]);
}

bzoj4137 [FJOI2015]火星商店问题的更多相关文章

  1. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  2. [FJOI2015]火星商店问题

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

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

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

  4. 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)

    [BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...

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

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

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

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

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

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

  8. BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题

    https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ...

  9. 【bzoj4137】[FJOI2015]火星商店问题

    *题目描述: 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能 ...

随机推荐

  1. uploadify

    uploadify 返回值(回调函数)总结: 最近使用开发一个图片上传模块的时候使用了一个jq插件--uploadify,但是下面就是让人很苦逼的一个下午……一直调试不好,无法接收返回值.google ...

  2. 低功耗蓝牙BLE [学习笔记]

    手机设备会区分 "connecting" and "pairing" ,前者可以自动连接,后者则需要请求.BLE不再有pairing的麻烦,能直接连上目标设备, ...

  3. Bluetooth LMP介绍

    目录 1. 介绍 2. 数据包格式(Packet Format) 3. Procedure Rules 4. 通用回应消息(General Response Messages) 5. 设备特性(Dev ...

  4. ecshop换用redis做缓存

    <?php /** * ecshop SESSION 保存类 * ================================================================ ...

  5. mssql 常用SQL语句或函数

    按 OrderDate 的顺序计算 SalesOrderHeader 表中所有行的行号,并只返回行 50 到 60(含). WITH OrderedOrders AS ( SELECT SalesOr ...

  6. C# 中==与Equals方法比较

    先来段代码,如下: static void Main(string[] args) { string a = new string(new char[] { 'h', 'e', 'l', 'l', ' ...

  7. JS 获取和监听屏幕方向变化(portrait / landscape)

    移动设备的屏幕有两个方向: landscape(横屏)和portrait(竖屏),在某些情况下需要获取设备的屏幕方向和监听屏幕方向的变化,因此可以使用Javascript提供的 MediaQueryL ...

  8. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  9. Search in Rotated Sorted Array I

    Search in Rotated Sorted Array I Suppose a sorted array is rotated at some pivot unknown to you befo ...

  10. Project Management Process

    Project Management ProcessDescription .............................................................. ...