2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门
题意:序列上有nnn个商店,有两种事件会发生:
- sss商店上进购标价为vvv的一个物品
- 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值。
每个位置都有一种物品每天会新进购(最开始会给出)。
思路:
第一眼显然的线段树套可持久化01trie 恭喜MLE走人
然后发现每个人的询问可以放到按时间建出的线段树上,这个不就可以线段树分治离线处理了吗。
于是把每天进购的物品排个序下放,每一层线段树用一个可持久化01trie来统计答案即可(注意这个并不是线段树和可持久化01trie套在一起)
代码:
#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
#define ri register int
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
const int N=1e5+5,P=17;
int n,m,stk[N],rt[N],siz[N*20],son[N*20][2],top=0,tot=0,sig=0,ans[N],cnt=0;
vector<int>e[N],qry[N<<2];
struct Query{int l,r,dl,dr,v;}pd[N];
struct UPD{int s,v,d;}upd[N],t1[N],t2[N];
inline void insert(int&p,int last,int val){int o=p=++tot;for(ri i=17;~i;--i){int tmp=(val>>i)&1;son[o][tmp]=++tot,son[o][tmp^1]=son[last][tmp^1];o=son[o][tmp],last=son[last][tmp],siz[o]=siz[last]+1;}
}
inline int query(int ql,int qr,int val){int ret=0;for(ri i=17;~i;--i){int tmp=(val>>i)&1;if(siz[son[qr][tmp^1]]^siz[son[ql][tmp^1]])ret|=(1<<i),ql=son[ql][tmp^1],qr=son[qr][tmp^1];else ql=son[ql][tmp],qr=son[qr][tmp];}return ret;
}
inline void update(int p,int l,int r,int ql,int qr,int v){if(ql>r||qr<l||ql>qr)return;if(ql<=l&&r<=qr){qry[p].push_back(v);return;}if(qr<=mid)update(lc,l,mid,ql,qr,v);else if(ql>mid)update(rc,mid+1,r,ql,qr,v);else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,ql,qr,v);
}
inline void calc(int p,int l,int r){tot=top=0;for(ri i=l;i<=r;++i){int s=upd[i].s,v=upd[i].v;stk[++top]=s,insert(rt[top],rt[top-1],v);}for(ri i=0;i<qry[p].size();++i){int x=qry[p][i];int ql=upper_bound(stk+1,stk+top+1,pd[x].l-1)-stk-1;int qr=upper_bound(stk+1,stk+top+1,pd[x].r)-stk-1;ans[x]=max(ans[x],query(rt[ql],rt[qr],pd[x].v));}
}
inline 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 hd1=0,hd2=0;for(ri i=ql;i<=qr;++i)if(upd[i].d<=mid)t1[++hd1]=upd[i];else t2[++hd2]=upd[i];for(ri i=1;i<=hd1;++i)upd[ql+i-1]=t1[i];for(ri i=1;i<=hd2;++i)upd[ql+hd1+i-1]=t2[i];solve(lc,l,mid,ql,ql+hd1-1),solve(rc,mid+1,r,ql+hd1,qr);
}
inline bool cmp(const UPD&a,const UPD&b){return a.s<b.s;}
int main(){n=read(),m=read();for(ri i=1;i<=n;++i)insert(rt[i],rt[i-1],read());for(ri i=1,op,ql,qr,x,s,d,v;i<=m;++i){op=read();if(op){ql=read(),qr=read(),x=read(),d=read();ans[++sig]=query(rt[ql-1],rt[qr],x);pd[sig]=(Query){ql,qr,max(1,cnt-d+1),cnt,x};}else s=read(),v=read(),upd[++cnt]=(UPD){s,v,cnt};}for(ri i=1;i<=sig;++i)update(1,1,cnt,pd[i].dl,pd[i].dr,i);sort(upd+1,upd+cnt+1,cmp);solve(1,1,cnt,1,cnt);for(ri i=1;i<=sig;++i)cout<<ans[i]<<'\n';return 0;
}
转载于:https://www.cnblogs.com/ldxcaicai/p/10367772.html
2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)相关推荐
- bzoj4137[FJOI2015]火星商店问题
分析: 首先,一看到求val xor x最大,我们就应该想到可持久化Trie,(详见P4585),这样,当我们询问 L,RL,RL,R 之间的最大异或值时,就直接套用可持久化Trie就行了,这样空间这 ...
- 2019南昌网络赛-I(单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...
- 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...
- 2019 牛客多校 C Governing sand 线段树
链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 Governing sand 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 6 ...
- 2019 ICPC银川区域赛 G - Pot!!(线段树维护动态RMQ)
传送门 题目大意 若ppp为质数,定义potp(n)pot_p(n)potp(n)为nnn分解质因数ppp的指数.给定一个初始全为111的序列aaa,有两种操作: MULTIPLY l r:将区间[ ...
- [计蒜之道2019 复赛 A]外教 Michale 变身大熊猫 (线段树求LIS+思维)
外教变身萌翻小学员,VIPKID "AR 变脸" 打造趣味互动课堂,这是在线少儿英语品牌 VIPKID 全新推出的辅助教学功能--AR 变脸,外教在上课过程中可以随意选取合适的表情 ...
- 2019.01.07|区块链技术头条
2019.01.07|区块链技术头条 1.科普 | 深处的蚁穴:与 Gas 相关的三种安全问题 2.科普 | OmiseGo 将如何把 Plasma 带入寻常百姓家 3.干货 | 详解 MimbleW ...
- python --- 常见题目 2019.01.03
python --- 面试题 2019.01.03 1. redis 设置过期时间 2. 登录的GET和POST区别 3. python和go的区别 4. 生成器和迭代器 5. 盒子模型 6. RES ...
- WPS Office 2019 For Linux在深度应用商店上线
近日,WPS Office 2019 For Linux 新版本正式发布,版本号为11.1.0.8372(以下简称WPS 2019).除延续WPS 2016版相同体验外,WPS 2019 界面更灵活. ...
最新文章
- 基因疾病关联的图卷积神经网络
- markdown常用操作(特殊字符显示、换行、字体颜色和大小、图片位置和大小)
- 用Visual Studio .Net 2003开发PHP程序
- 汤家凤高等数学基础手写笔记-不定积分
- Windows 下单机最大TCP连接数
- python和php互动_PHP中常见的五种设计模式
- linux ini文件,Shell script - Linux下解析ini配置文件
- android 按键会触发ontouch吗?_Android实现炫酷的拖拽浮动按钮
- 因特网上的计算机通常使用的网络协议为,计算机网络原理自考2015年10月真题
- php 小程序回调,微信小程序Promise简化回调实例分享
- 蓝桥杯数字三角形java,蓝桥杯数字三角形(java)
- 智能优化算法:世界杯优化算法-附代码
- 杂七杂八(7): win7无法安装python3
- L0到L4超全介绍!30+自动驾驶方案汇总
- 熄风的止颤的汤治疗帕金森的优势
- 力扣动态规划全题型解析【基础、背包、股票、编辑距离、回文】
- pron网站制作遇到的问题
- 计算机数据表格方框,excel表格数据变框框了-Excel表格弄着弄着突然变成这样了,内容方框全无,有......
- 【OpenCV图像处理】十五、图像空域滤波(上)
- LincSNP:lncRNA相关SNP位点数据库
热门文章
- bean的作用域_Spring 框架基础(02):Bean的生命周期,作用域,装配总结
- 计算机科技作品大赛,世界编程大赛一等奖作品
- oracle11g临时表,oracle11G的临时表空间
- 简单的java程序代码带注释,Java:基于注释的代码注入的简单技术?
- android 4 动画,[Android]开发App,你得知道这些4——动画
- python中sorted()函数的用法_Python中的Sorted()函数
- 大规模针对iOS设备的恶意广告活动劫持3亿次浏览器会话
- 移动端ios和安卓input问题
- 使用electron和vue,以ipc通信的方式构建客户端版本的掘金首页
- 如何夺回Windows 10系统权限?一分钟就够