luoguP4585 [FJOI2015]火星商店问题
题意
显然商店编号的限制能用可持久化trie解决。
特殊的商品预先判掉就好了,现在只考虑普通的商品。
发现商品的时间是单点,询问时一段时间,于是将询问区间在线段树上拆成\(log\)个区间,分别放上该询问。
之后dfs整颗线段树,先计算当前节点上的询问,之后将商品按照出现时间是在中点左右分成两类递归。
code:
#include<bits/stdc++.h>
using namespace std;
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
const int maxn=1e5+10;
int n,m,cnt1,cnt2,tot,num;
int ans[maxn],root[maxn],cnt[maxn*40],a[maxn];
int trie[maxn*40][2];
struct Buy{int tim,x,k;}buy[maxn],tmp1[maxn],tmp2[maxn];
struct Query{int sl,sr,tl,tr,k;}qr[maxn];
vector<int>seg[maxn<<2];
inline bool cmp(Buy a,Buy b){return a.x<b.x;}
void insert(int pre,int& now,int t,int k)
{
now=++tot;
trie[now][0]=trie[pre][0];trie[now][1]=trie[pre][1];cnt[now]=cnt[pre]+1;
if(t<0)return;
int c=(k>>t)&1;
insert(trie[pre][c],trie[now][c],t-1,k);
}
int query(int pre,int now,int t,int k)
{
if(t<0)return 0;
int c=(k>>t)&1;
if(cnt[trie[now][c^1]]-cnt[trie[pre][c^1]])return (1<<t)|query(trie[pre][c^1],trie[now][c^1],t-1,k);
else return query(trie[pre][c],trie[now][c],t-1,k);
}
void change(int p,int l,int r,int ql,int qr,int id)
{
if(ql>qr)return;
if(l>=ql&&r<=qr){seg[p].push_back(id);return;}
int mid=(l+r)>>1;
if(ql<=mid)change(ls(p),l,mid,ql,qr,id);
if(qr>mid)change(rs(p),mid+1,r,ql,qr,id);
}
inline int find(int x)
{
int l=0,r=num,res;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]<=x)res=mid,l=mid+1;
else r=mid-1;
}
return res;
}
inline void calc(int p,int L,int R)
{
tot=num=0;
for(int i=L;i<=R;i++)
{
a[++num]=buy[i].x;
insert(root[num-1],root[num],18,buy[i].k);
}
for(unsigned int i=0;i<seg[p].size();i++)
{
int id=seg[p][i],l,r;
l=find(qr[id].sl-1),r=find(qr[id].sr);
ans[id]=max(ans[id],query(root[l],root[r],18,qr[id].k));
}
}
void solve(int p,int l,int r,int ql,int qr)
{
if(ql>qr)return;
calc(p,ql,qr);
if(l==r)return;
int mid=(l+r)>>1,cntl=0,cntr=0;
for(int i=ql;i<=qr;i++)
{
if(buy[i].tim<=mid)tmp1[++cntl]=buy[i];
else tmp2[++cntr]=buy[i];
}
for(int i=1;i<=cntl;i++)buy[ql+i-1]=tmp1[i];
for(int i=1;i<=cntr;i++)buy[ql+cntl+i-1]=tmp2[i];
solve(ls(p),l,mid,ql,ql+cntl-1);solve(rs(p),mid+1,r,ql+cntl,qr);
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
insert(root[i-1],root[i],18,x);
}
for(int i=1;i<=m;i++)
{
int op;scanf("%d",&op);
if(!op)
{
int x,k;scanf("%d%d",&x,&k);
cnt1++;buy[cnt1]=(Buy){cnt1,x,k};
}
else
{
int sl,sr,k,d;scanf("%d%d%d%d",&sl,&sr,&k,&d);
qr[++cnt2]=(Query){sl,sr,max(1,cnt1-d+1),cnt1,k};
ans[cnt2]=query(root[sl-1],root[sr],18,k);
}
}
for(int i=1;i<=cnt2;i++)change(1,1,cnt1,qr[i].tl,qr[i].tr,i);
sort(buy+1,buy+cnt1+1,cmp);
solve(1,1,cnt1,1,cnt1);
for(int i=1;i<=cnt2;i++)printf("%d\n",ans[i]);
return 0;
}
luoguP4585 [FJOI2015]火星商店问题的更多相关文章
- [FJOI2015]火星商店问题
[FJOI2015]火星商店问题 神仙线段树分治...不过我不会. 这题用线段树套可持久化Trie还是能写的. 常数有点大,洛谷垫底水平. // luogu-judger-enable-o2 #inc ...
- 【LG4585】[FJOI2015]火星商店问题
[LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
- [FJOI2015]火星商店问题(分治+可持久化)
题目描述 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能与已 ...
- BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题
https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ...
- 【bzoj4137】[FJOI2015]火星商店问题
*题目描述: 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能 ...
- [洛谷P4585] [FJOI2015] 火星商店问题
Description 火星上的一条商业街里按照商店的编号 \(1\),\(2\) ,-,\(n\) ,依次排列着 \(n\) 个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数 \(va ...
随机推荐
- AHOI 2009 维护序列
洛谷 P2023 [AHOI2009]维护序列 洛谷传送门 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式 ...
- 基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
学习环境: 操作系统 IP地址 主机名 软件包 备注 CentOS7.5 192.168.200.111 localhost 实验初始配置:所有主机关闭防火墙与selinux [root@ ...
- Swiper实现轮播图效果
为了实现轮播图(carousel)效果或左右滑动显示不同的内容,我们采用Swiper来实现. 需要引入swiper.min.css和swiper.min.js,文件可从https://github.c ...
- IT兄弟连 Java语法教程 流程控制语句 控制循环结构2
使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...
- PHPStorm使用PHP7新特性出现红色波浪错误
今天在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,看着让人很不舒服,明明没有错 本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的 ...
- 删除链表的中间节点和a/b处的节点
问题描述: 删除链表的中间节点和a/b处的节点 给定链表的头结点head,实现删除链表的中间节点的函数: 例如: 不删除任何节点: 1-->2,删除节点1: 1-->2-->3,删除 ...
- solr集群Server refused connection at: http://127.0.0.1:6060/solr/ego 注册zookeepr自动使用内网ip
引导:适用于各种注册服务,zookeeper和被注册的服务器不在同一ip上,产生的注册了127.0.0.1本地ip地址 在使用solr集群操作的时候,报了如下的错误 org.apache.solr.c ...
- vs2017 发布工具 Installer 发包遇到的问题处理
一. 遇到的问题. ERROR: 要在“系统必备”对话框中启用“从与我的应用程序相同的位置下载系统必备组件”,必须将“Microsoft .NET Framework 4.7.2 (x86 和 x64 ...
- HTML语法规范
HTML语法规范 语法规范概述 HTML标签是由尖括号包围的关键词,例如<html> HTML标签通常是成对出现的,例如<html> 和</html> ,我们成为双 ...
- 专访腾讯方亮:WeTest品牌全面升级,“好的产品一定深谙人性”
工欲善其事,必先利其器.在当下竞争激烈的市场环境中,精品,已经成为所有游戏厂商安身立命之本.但如何提升品质,使产品成为精品,行业内却长期缺乏公开.透明,以及具备实际参考.实操价值的标准. 制定一项标准 ...