2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)
传送门
01trie经典题目。
我们可以通过计算每个数作为次小值时对答案的贡献。
显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[i]a[i]a[i]
于是将原数组排序之后用双向链表维护。
接着用01trie贪心求出贡献。
#include<bits/stdc++.h>
#define N 200005
#define P 30
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;
}
int n,rt[N],pre[N],nt[N],ans=0;
struct node{int id,val;}a[N];
inline bool cmp(node a,node b){return a.val<b.val;}
struct Trie{
int son[N*30][2],siz[N*30],tot;
inline int insert(int las,int val){
int p,ret;
p=ret=++tot;
for(int i=P;~i;--i){
son[p][0]=son[las][0],son[p][1]=son[las][1],siz[p]=siz[las]+1;
int tmp=(val>>i)&1;
son[p][tmp]=++tot,las=son[las][tmp],p=son[p][tmp];
}
siz[p]=siz[las]+1;
return ret;
}
inline int query(int l,int r,int val){
int ret=0;
for(int i=P;~i;--i){
int tmp=(val>>i)&1;
if(siz[son[r][tmp^1]]-siz[son[l][tmp^1]])ret|=(1<<i),l=son[l][tmp^1],r=son[r][tmp^1];
else l=son[l][tmp],r=son[r][tmp];
}
return ret;
}
}T;
int main(){
n=read();
for(int i=1;i<=n;++i)a[i]=(node){i,read()},pre[i]=i-1,nt[i]=i+1,rt[i]=T.insert(rt[i-1],a[i].val);
pre[0]=0,nt[0]=1,pre[n+1]=n,nt[n+1]=n+1,sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i){
int tmp=a[i].id,lasl=pre[tmp],lasr=nt[tmp],l=pre[lasl],r=nt[lasr];
if(l+1<=lasr-1)ans=max(ans,T.query(rt[l],rt[lasr-1],a[i].val));
if(r-1>=lasl+1)ans=max(ans,T.query(rt[lasl],rt[r-1],a[i].val));
nt[pre[tmp]]=nt[tmp],pre[nt[tmp]]=pre[tmp];
}
printf("%d",ans);
return 0;
}
2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)的更多相关文章
- BZOJ3166: [Heoi2013]Alo
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 394 Solved: 204[Submit][Status] ...
- [BZOJ3166][Heoi2013]Alo 可持久化Trie树
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MB DescriptionWelcome to ALO ( Arithmetic a ...
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- 2018.09.29 Lua
转自:https://zybuluo.com/lisaisacat/note/636399 谢谢 Lua 基础简明教程 脚本开发 目录 Lua 基础简明教程 目录 注释 Lua 编程 语句块 赋 ...
- 2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)
传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++. ...
- 2018.09.29 bzoj3039: 玉蟾宫(悬线法)
传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...
- 2018.09.29 bzoj3156: 防御准备(斜率优化dp)
传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...
- 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)
传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...
- 【可持久化Trie】【set】bzoj3166 [Heoi2013]Alo
枚举每个数,计算以其为次大数的最大区间,显然,只需要用这个区间的答案 对 答案进行更新即可. 找到每个数右侧.左侧第1.2个比它大的数,然后分类讨论一下即可. 找到的过程中把数sort以后,从大到小把 ...
随机推荐
- IdUDPServer中文汉字乱码 及IdTCPClient
官网 http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer_OnExec ...
- autolayout UILabel 设置最大宽度
label1.preferredMaxLayoutWidth = 100: label1.numberOfLines = 0; //自适应行数
- github上关于iOS的各种开源项目集合(转)
UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITable ...
- locate包的安装
linux中locate命令可以快速定位我们需要查找的文件,但是在yum中,locate的安装包名为 mlocate(yum list | grep locate可以查看),安装方法: yum -y ...
- Spring Boot Unregistering JMX-exposed beans on shutdown
创建springboot项目运行的时候报这个错误Unregistering JMX-exposed beans on shutdown,搜索发现第一条是: Spring boot 嵌入的tomcat不 ...
- 显示AVI的第一桢
procedure TForm1.Button1Click(Sender: TObject);begin Application.ProcessMessages; MediaPlayer1.Ope ...
- 吴裕雄 python 数据处理(1)
import time print(time.time())print(time.localtime())print(time.strftime('%Y-%m-%d %X',time.localtim ...
- Web标准:二、一列布局
知识点: 1.一列固定宽度 2.一列固定宽度居中 3.一列自适应宽度 4.一列自适应宽度居中 5.一列二至多块布局 1)一列固定宽度 下图是定义了一个高300px,宽400px,颜色是#99FFc ...
- Guava Cache -- MapMaker.makeComputingMap测试
canal中很多处使用了MigrateMap.makeComputingMap(Function<? super K, ? extends V> computingFunction)方法, ...
- client / server端用户的登录
# 客户端 import socket import hashlib import json import os import struct sk = socket.socket() # 实例化 sk ...