【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~
code:
#include <bits/stdc++.h>
#define MAX 100300
#define ll long long
#define lson now<<1
#define rson now<<1|1
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
struct Buy {int s,v,t; }q[MAX],tmp1[MAX],tmp2[MAX];
struct ASK {int l,r,tl,tr,x; }p[MAX];
bool cmp(Buy a,Buy b) { return a.s<b.s; }
int rt[MAX];
namespace Trie
{
struct Trie { int son[2],w; } t[MAX<<5];
int tot,rt[MAX];
void insert(int &x,int ff,int w,int now)
{
t[x=++tot]=t[ff]; t[x].w++;
if(now==-1) return;
bool c=(w&(1<<now));
insert(t[x].son[c],t[ff].son[c],w,now-1);
}
int Query(int l,int r,int w,int now)
{
if(now==-1) return 0;
bool c=w&(1<<now);
int tmp=t[t[r].son[c^1]].w-t[t[l].son[c^1]].w;
if(tmp) return Query(t[l].son[c^1],t[r].son[c^1],w,now-1)+(1<<now);
else return Query(t[l].son[c],t[r].son[c],w,now-1);
}
};
int n,m,ans[MAX];
vector<int>seg[MAX<<2];
int cnt1,cnt2;
void Modify(int now,int l,int r,int L,int R,int x)
{
if(L>R) return;
if(l>=L&&r<=R) { seg[now].push_back(x); return; }
int mid=(l+r)>>1;
if(L<=mid) Modify(lson,l,mid,L,R,x);
if(R>mid) Modify(rson,mid+1,r,L,R,x);
}
int S[MAX],top;
int find(int x)
{
int l=1,r=top,re=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(S[mid]<=x) re=mid,l=mid+1;
else r=mid-1;
}
return re;
}
void sol(int now,int L,int R)
{
top=Trie::tot=0;
for(int i=L;i<=R;++i)
{
S[++top]=q[i].s;
Trie::insert(rt[top],rt[top-1],q[i].v,17);
}
for(int i=0;i<seg[now].size();++i)
{
int k=seg[now][i];
int l=find(p[k].l-1), r=find(p[k].r);
ans[k]=max(ans[k],Trie::Query(rt[l],rt[r],p[k].x,17));
}
}
void divide(int now,int l,int r,int L,int R)
{
if(L>R) return;
int mid=(l+r)>>1,t1=0,t2=0;
sol(now,L,R);
if(l==r) return;
for(int i=L;i<=R;++i)
{
if(q[i].t<=mid) tmp1[++t1]=q[i];
else tmp2[++t2]=q[i];
}
for(int i=1;i<=t1;++i) q[i+L-1]=tmp1[i];
for(int i=1;i<=t2;++i) q[i+L-1+t1]=tmp2[i];
divide(lson,l,mid,L,L+t1-1);
divide(rson,mid+1,r,L+t1,R);
}
int main()
{
// setIO("input");
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
Trie::insert(rt[i],rt[i-1],x,17);
}
for(i=1;i<=m;++i)
{
int opt;
scanf("%d",&opt);
if(!opt)
{
int s,v;
scanf("%d%d",&s,&v);
++cnt1;
q[cnt1]=(Buy){s,v,cnt1};
}
else
{
int l,r,x,d;
scanf("%d%d%d%d",&l,&r,&x,&d);
ans[++cnt2]=Trie::Query(rt[l-1],rt[r],x,17);
p[cnt2]=(ASK){l,r,max(1,cnt1-d+1),cnt1,x};
}
}
for(i=1;i<=cnt2;++i) Modify(1,1,cnt1,p[i].tl,p[i].tr,i);
sort(&q[1],&q[cnt1+1],cmp);
divide(1,1,cnt1,1,cnt1);
for(int i=1;i<=cnt2;++i) printf("%d\n",ans[i]);
return 0;
}
【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie的更多相关文章
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- 洛谷 P4585 [FJOI2015]火星商店问题
(勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...
- bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】
其实我不太清楚这个应该叫CDQ分治还是整体二分 参考:http://blog.csdn.net/lvzelong2014/article/details/78688727 一眼做法是线段树套可持久化t ...
- [洛谷P4585] [FJOI2015] 火星商店问题
Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...
随机推荐
- 【转】Isim——基本技巧
来源:电子产品世界: 注:本文由NingHeChuan本人多出整理所得,原文章图片不清晰,自己整理配图后重新发表 安装好ISE,系统已经自带了ISim仿真软件,相比于专业的仿真软件Modelsim,I ...
- Jenkins+harbor+gitlab+k8s 部署maven项目
一.概述 maven项目部署流程图如下: 环境介绍 操作系统 ip 角色 版本 ubuntu-16.04.4-server-amd64 192.168.10.122 Jenkins+harbor Je ...
- UOJ424 Count 生成函数、多项式求逆、矩阵快速幂
传送门 两个序列相同当且仅当它们的笛卡尔树相同,于是变成笛卡尔树计数. 然后注意到每一个点的权值一定会比其左儿子的权值大,所以笛卡尔树上还不能够存在一条从根到某个节点的路径满足向左走的次数\(> ...
- python内存机制与垃圾回收、调优手段
目录 一.python的内存机制 二.python的垃圾回收 1. 引用计数 1.1 原理: 1.2 优缺点: 1.4 两种情况: 2. 标记清除 2.1 原理: 2.2 优缺点: 3. 分代回收 3 ...
- java之spring之整合ssh-2
这篇也是主要讲解 ssh 的整合,不同于上一篇的是它的注入方式. 这篇会采用扫描注入的方式,即去除 applicationContext-asd.xml 文件. 目录结构如下: 注意,这里只列举不同的 ...
- 2019 新浪 java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新浪等公司offer,岗位是Java后端开发,因为发展原因最终选择去了新浪,入职一年时间了,也成为了面试官,之 ...
- springmvc框架helloword
spring框架提供了构建web的应用程序的全功能MVC模块-spring mvc.我们首先来写一个springmvc的hellword的配置文件的形式 工程结构如下 index.jsp <%@ ...
- linux技能四 用户管理
用户管理:用户类型,添加用户,修改用户,删除用户,查看用户信息,用户的切换,添加组,修改组,删除组,查看组 用户类型:超级用户:root,UID=1 系统用户:运行系统服务的,不能登陆的,UID=(1 ...
- unity shader入门(四):高光
高光反射计算公式(phong模型)Cspecular=(Clight*Mspecular)max(0,v*r)mgloss mgloss为材质的官泽度,也成反射度,控制高光区域亮点有多大 Mspecu ...
- JavaScript: 详解正则表达式之三
在上两篇文章中博主介绍了JavaScript中的正则常用方法和正则修饰符,今天准备聊一聊元字符和高级匹配的相关内容. 首先说说元字符,想必大家也都比较熟悉了,JS中的元字符有以下几种: / \ | . ...