博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HEOI2013]ALO
阅读量:4957 次
发布时间:2019-06-12

本文共 1323 字,大约阅读时间需要 4 分钟。

题目描述:

现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, …, aj,则融合而成的宝石的能量密度为这些宝石中能量密度的次大值 与其他任意一颗宝石的能量密度按位异或的值,即,设该段宝石能量密度次大值 为 k,则生成的宝石的能量密度为 max{k xor ap | ap ≠ k , i ≤ p ≤ j}

题解:

首先建可持久化Trie。

然后是区间的选取问题。

想了好久想出来一种方法:

对于每个点建双向链表,从小到大删点。

对于每个点可取区间为[左方第二个比它大的+1,右方第二个比它大的-1]。

代码:

#include
#include
#include
using namespace std;#define N 50050inline int rd(){ int f=1,c=0;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=10*c+ch-'0';ch=getchar();} return f*c;}int n,a[N];struct Trie{ int tot,siz[32*N],ch[32*N][2],rt[N]; void insert(int k,int x) { int u,l=rt[k-1]; rt[k]=u=++tot; for(int i=30;i>=0;i--) { ch[u][0]=ch[l][0],ch[u][1]=ch[l][1],siz[u]=siz[l]+1; int k = (x>>i)&1; ch[u][k]=++tot; u=ch[u][k],l=ch[l][k]; } siz[u]=siz[l]+1; } int query(int l,int r,int x) { l = rt[l],r = rt[r]; int ret = 0; for(int i=30;i>=0;i--) { int k = (x>>i)&1; if(siz[ch[r][!k]]-siz[ch[l][!k]]) { l=ch[l][!k],r=ch[r][!k]; ret|=(1<

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10024032.html

你可能感兴趣的文章
linux之查找文件,目录命令
查看>>
EXTJS信息提示框的注意事项
查看>>
POI Excel表格合并,边框设置
查看>>
CocoaPods 建立私有仓库
查看>>
ubuntu下code::blocks设置运行窗口为gnome命令行
查看>>
Web开发(XAMPP服务器搭建)
查看>>
vue2.0 实现click点击当前li,动态切换class
查看>>
java中equals方法和“==”的区别
查看>>
jQuery easing
查看>>
shell之使用cut切割文本文件
查看>>
基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用
查看>>
撤销操作
查看>>
sscanf在字符串中的一些使用
查看>>
[转]new一个Object对象占用多少内存?
查看>>
一步步教你Hadoop多节点集群安装配置
查看>>
JS_轮播案例
查看>>
【转】STM32 - 程序跳转、中断、开关总中断
查看>>
== & ===
查看>>
详解C#中的反射
查看>>
给java初学发者的一些建议,并对自身一年做一个总结。
查看>>