洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树
解题报告:
$umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或者查询最近的$d$次向编号在$[l,r]$内的集合加入的元素中,与$x$异或和的最大值
首先看到异或就想到$trie$树昂$QwQ$
然后就还有一个时间限制和一个位置限制.
先考虑时间限制趴?就魔改下$trie$树,本来每个节点记录的是是否存在这个节点?现在变成这个节点最近一次被更新的时间,这样就能满足时间限制了嘛$QwQ$
然后对于位置限制,就考虑加一个线段树.
因为这种最大值问题是满足结合律的?所以可以分别在每个节点上做然后合并起来就成.
$over$
昂然后不开$O2$会$T$,但是反正开了$O2$能过嘛我就懒得管了$kk$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define fi first
#define sc second
#define gc getchar()
#define mp make_pair
#define P pair<int,int>
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=1e7+;
int n,m,dat,rt[N],rt_cnt,nod_cnt,T;
struct node{int to[],tot;}nod[N];
vector<P>S[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void insert(ri dat,ri pre)
{
//printf("dat=%d pre=%d\n",dat,pre);
rt[++rt_cnt]=++nod_cnt;nod[rt[rt_cnt]]=nod[rt[pre]];ri nw=rt[rt_cnt];++nod[nw].tot;
my(i,,)
{ri t=(dat>>i)&;nod[++nod_cnt]=nod[nod[nw].to[t]];nod[nw].to[t]=nod_cnt;nw=nod[nw].to[t];++nod[nw].tot;}
}
il int ask(ri l,ri r,ri dat)
{
//printf("l=%d r=%d dat=%d\n",l,r,dat);
ri as=;
my(i,,)
{
ri t=!((dat>>i)&);
if(nod[nod[r].to[t]].tot-nod[nod[l].to[t]].tot)as+=<<i,r=nod[r].to[t],l=nod[l].to[t];
else r=nod[r].to[!t],l=nod[l].to[!t];
}
return as;
}
void modify(ri nw,ri l,ri r,ri to,ri dat,ri tim)
{
insert(dat,S[nw].back().sc);S[nw].push_back(mp(tim,rt_cnt));if(l==r)return;
ri mid=(l+r)>>;to<=mid?modify(nw<<,l,mid,to,dat,tim):modify(nw<<|,mid+,r,to,dat,tim);
}
int query(ri nw,ri l,ri r,ri to_l,ri to_r,ri K,ri dat)
{
if(to_l<=l && r<=to_r)
{
ri pos=upper_bound(S[nw].begin(),S[nw].end(),mp(dat,))-S[nw].begin()-;
//printf("%d-%d %d-%d dat=%d\n",S[nw][pos].sc,S[nw][pos].fi,S[nw].back().sc,S[nw].back().fi,dat);
//ri tmp=S[nw].size();rp(i,0,tmp-1)printf(" %d",S[nw][i].fi);printf("\n");
//printf("pos=%d\n",pos);
return ask(rt[S[nw][pos].sc],rt[S[nw].back().sc],K);
}
ri mid=(l+r)>>,ret=;
if(to_l<=mid)ret=max(ret,query(nw<<,l,mid,to_l,to_r,K,dat));
if(mid<to_r)ret=max(ret,query(nw<<|,mid+,r,to_l,to_r,K,dat));
return ret;
} int main()
{
//freopen("4585.in","r",stdin);freopen("4585.out","w",stdout);
n=read();m=read();rp(i,,n)insert(read(),i-);rp(i,,n<<)S[i].push_back(mp(,));
while(m--)
{
ri opt=read();
if(opt)
{
ri l=read(),r=read(),x=read(),d=read(),as=ask(rt[l-],rt[r],x);
if(d)as=max(as,query(,,n,l,r,x,T-d+));;printf("%d\n",as);
}
else{ri x=read(),d=read();++T;modify(,,n,x,d,T);}
}
return ;
}
洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树的更多相关文章
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- [洛谷P4585] [FJOI2015] 火星商店问题
Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...
- 洛谷 P4585 [FJOI2015]火星商店问题
(勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...
- 【洛谷】P4585 [FJOI2015]火星商店问题
题解 题目太丧,OJ太没有良心,我永远喜欢LOJ! (TLE报成RE,垃圾洛谷,我永远喜欢LOJ) 好的,平复一下我debug了一上午崩溃的心态= =,写一写这道题的题解 把所有限制去掉,给出一个值, ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
随机推荐
- 22-2 模板语言的进阶和fontawesome字体的使用
一 fontfawesome字体的使用 http://fontawesome.dashgame.com/ 官网 1 下载 2 放到你的项目下面 3 html导入这个目录 实例: class最前面的f ...
- HDU-4807-Lunch Time(二分+费用流,思维)
这道题非常好,如果没有真正弄懂费用流算法的人,只会套模版的人是肯定做不出来的. 我们其实这样考虑,费用流真正的思想是吧费用作为长度,然后跑最短路,同时保证路上的流量不为0,也就是增广: 跑到终点后,回 ...
- Libev源码分析07:Linux下的eventfd简介
#include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); eventfd创建一个eventfd对象,该对 ...
- php服务端允许跨域访问
>>php服务端允许跨域访问<< >>同源策略和跨域解决方案<<
- BERT-Pytorch demo初探
https://zhuanlan.zhihu.com/p/50773178 概述 本文基于 pytorch-pretrained-BERT(huggingface)版本的复现,探究如下几个问题: py ...
- 【CSS3】分类豆腐块菜单浮动效果
HTML <html> <head> <title></title> <style type="text/css"> # ...
- lrj 9.4.1 最长上升子序列 LIS
p275 d(i)是以Ai为结尾的最长上升子序列的长度 <算法竞赛入门经典-训练指南>p62 问题6 提供了一种优化到 O(nlogn)的方法. 文本中用g(i)表示d值为i的最小状态编号 ...
- uni-app 快速认识
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/阿里/百度/头条/QQ)等多个平台. 即使不跨端,un ...
- Codeforces Round #178 (Div. 2)
A. Shaass and Oskols 模拟. B. Shaass and Bookshelf 二分厚度. 对于厚度相同的书本,宽度竖着放显然更优. 宽度只有两种,所以枚举其中一种的个数,另一种的个 ...
- Spring Boot Thymeleaf 使用详解
在上篇文章Spring Boot (二):Web 综合开发中简单介绍了一下 Thymeleaf,这篇文章将更加全面详细的介绍 Thymeleaf 的使用.Thymeleaf 是新一代的模板引擎,在 S ...