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

语文没学好不要写省选题面!!!!

题目大意:

有\(n\)个集合,每个集合有个任意时刻都可用的初始元素。现在有\(m\)个操作

  • 询问\([l,r]\)的集合中,使得\(v\oplus x\)最大的那个元素,输出\(v\oplus x\)。同时要求这个\(x\)是最近\(d\)次插入中插入的。
  • 在集合\(i\)中插入一个数\(x\)。

考虑这样一个做法,直接开一颗线段树,线段树每个节点是一个\(trie\)树(不用可持久化),维护节点代表的区间中的集合的所有元素构成的\(trie\)树。

考虑时间复杂度

  • 每次询问被拆成\(\log n\)个询问,加上\(trie\)的复杂度\(O(n \log^2n)\)
  • 每次插入也被拆成\(\log n\)个插入,加上\(trie\)的复杂度\(O(n \log^2n)\)

考虑空间复杂度

  • 考虑每个元素被插入了\(O(\log n)\)次,加上\(trie\)树就是\(O(n\log^2 n)\)

trie节点要开3e7个,就问你够不够暴力。

7.59s / 288.88MB / 1.92KB C++11

//@winlere
#include<iostream>
#include<cstdio>
#include<algorithm>
#define mid ((l+r)>>1)
#define lef L,R,l,mid,pos<<1
#define rgt L,R,mid+1,r,pos<<1|1 using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} const int maxn=1e5+5;
const int inf=1e9+7; struct E{
int son[2],cnt;
E(){son[0]=son[1]=0;cnt=-inf;}
inline int& operator[](int x){return son[x];}
}dic[25000000];
int seg[maxn<<2],cnt,n,m; inline void insert(const int&now,const int&x,const int&d){
int k=now;
dic[k].cnt=max(dic[k].cnt,d);
for(int t=30;~t;--t){
int f=x>>t&1;
k=dic[k][f]?dic[k][f]:dic[k][f]=++cnt,dic[k].cnt=max(dic[k].cnt,d);
}
} int getans(const int&now,const int&x,const int&d){
int k=now,ret=0;
for(int t=30;~t;--t){
int f=x>>t&1;
if(dic[k][f^1]&&dic[dic[k][f^1]].cnt>=d) k=dic[k][f^1],ret|=1<<t;
else k=dic[k][f];
}
return ret;
} void upd(const int&x,const int&d,const int&L,const int&R,const int&l,const int&r,const int&pos){
if(L>r||R<l)return;
if(!seg[pos]) seg[pos]=++cnt;
insert(seg[pos],x,d);
if(l==r) return;
upd(x,d,lef); upd(x,d,rgt);
} int que(const int&ans,const int&d,const int&L,const int&R,const int&l,const int&r,const int&pos){
if(L>r||R<l) return 0;
if(L<=l&&r<=R) return getans(seg[pos],ans,d);
return max(que(ans,d,lef),que(ans,d,rgt));
} int main(){
n=qr(); m=qr();
int day=1;
for(int t=1;t<=n;++t)
upd(qr(),inf,t,t,1,n,1);
for(int t=1,t1,t2,t3,t4;t<=m;++t)
if(qr()) t1=qr(),t2=qr(),t3=qr(),t4=qr(),printf("%d\n",que(t3,max(0,day-t4+1),t1,t2,1,n,1));
else ++day,t1=qr(),t2=qr(),upd(t2,day,t1,t1,1,n,1);
return 0;
}

【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)的更多相关文章

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

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

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

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

  3. 【bzoj3217】ALOEXT 替罪羊树套Trie树

    题目描述 taorunz平时最喜欢的东西就是可移动存储器了……只要看到别人的可移动存储器,他总是用尽一切办法把它里面的东西弄到手. 突然有一天,taorunz来到了一个密室,里面放着一排可移动存储器, ...

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

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

  5. 【题解】FJOI2015火星商店问题

    好几天之前做的题目了,一直想写一下博客也没腾出时间来,今天赶紧把坑给填上呼呼呼~ 这道题首先如果只考虑每个商店中没有时间限制的物品时,我们只需要使用一棵可持久化trie树来维护区间内的异或最大值即可, ...

  6. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

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

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

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

    (勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...

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

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

随机推荐

  1. 突然想起一个有趣的问题:FAT32&NTFS?

    在大学的时候老师提过一个有意思的问题4G的程序存储在什么格式以上的电脑? 首先普及一下两种格式的区别 FAT32:此硬盘格式不支持4GB以上大文件,使用32位文件分配表. NTFS:微软最新文件格式, ...

  2. Jmeter If控制器

    "${xxx}"=="1" 或者 "${xxx}"!="2"

  3. vue3——vue数据循环渲染

    博客地址 :https://www.cnblogs.com/sandraryan/ vue循环渲染 <!DOCTYPE html> <html lang="en" ...

  4. 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解

    1. 先看一段代码 def is_login(func): def foo(*args,**kwargs): return func(*args,**kwargs) return foo def te ...

  5. poj 3334 Connected Gheeves (Geometry + BInary Search)

    3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水.它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出.开始的时候打 ...

  6. 2013-4-3 C#中alt键不是Keys.Alt 而是 Keys.LMenu

    2013-4-3 C#中alt键不是Keys.Alt而是Keys.LMenu

  7. html选择题

    1.下面关于css样式和html样式的不同之处说法正确的是(A) A.html样式只影响应用它的文本和使用所选html样式创建的文本 B.css样式只可以设置文字字体样式        不仅仅能够设置 ...

  8. 原生js实现最简单的瀑布流布局

    文章地址 https://www.cnblogs.com/sandraryan/ 瀑布流:瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动, ...

  9. HDU 1114 完全背包问题

    题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出... 思路:变形的完全背包问题,只是 ...

  10. 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...