TMOOC 1969 开锁
update on 2020.2.28 时隔近日重新想这道题,其实复杂度正确的解法是 可持久化 01 Trie。
考虑对于每一个 \(a[i]\),考虑能将它作为最大值的最大包容区间 \([l, r]\) 在这个里面找一个 \(x\) 使亦或值最大,这显然是可持久化 01 Trie 的标准操作
总复杂度 \(O(N * 32)\)
题目描述
(时间限制:1000ms 内存限制:51200KB)
小明经过千辛万苦,终于来到了 小韩隆的门前。但是小韩隆早有防备,将自己的门锁换成了密码锁。密码锁上有 \(n\) 个数字和一个输入装置。这n个数字是小韩隆刻在锁上的,看来需要解谜了。小明知道小韩隆十分喜欢异或,于是他猜想,这个装置应该是由两个数异或而成。通过小弟们对邻居的询问,小明知道了这个密码是由如下方法构造出的:从$ n $个数字中任选一段数字 \(I\) 到 \(r\),从其中任选一个数$ X \(,将这一段数的最大值与\) x \(异或起来得到y。锁的密码就是所有\) y \(值中的最大值。小明冥思苦想了几个小时,终于发现:因为\) l $、 $r $、 \(x\) 都是他自己选的,所以得到的y值会有很多个。由于小明受到NOIP的打击,十分厌恶“大力出奇迹”,他不想再一个一个试密码。现在他找到了作为小弟的你,想要你告诉他锁的密码是多少。
但是小明没有算到的是,小小明来到了小韩隆家做客,他改变了密码锁的密码。现在密码是这样构造的:从 \(n\) 个数字中任选一段数字 \(I\) 到 \(r\) ,从其中任选一个数 \(X\) ,将这一段数的次大值与 \(x\) 异或起来得到 \(y\) 。锁的密码就是所有 \(y\) 值中的最大值。因为你十分讨厌小明,不想让他大力出这个密码,所以你要算出小小明改完之后,这个锁的密码是多少,方便误导小明。
输入样例
5
9 2 1 4 7
输出样例
14
样例解释
第一个样例\(l\)=1,\(r\)=5,选取的\(x\)为9,密码为7^9=14。
数据范围
对于40%的数据:\(n\)<=5000。
对于100%的数据:1<=\(n\)<=50000,1<=\(a[i]\)<=10^9,保证\(a[i]\)两两不同。
思路
设\([i][j][0]\)为从ij的最大值、$f[i][j][1]$为从ij的次大值。
那么,对于任意i~j,a[i]来说,
- 如果\(a[i]>f[i][j-1][0]\),那么\(f[i][j][1]=f[i][j-1][0]\)、\(f[i][j][0]=a[i]\)(顺位下沿),可以异或的y值为\(a[i]\) xor \(a[i...j-1]\)。
- 否则如果\(a[i]>f[i][j-1][1]\),那么\(f[i][j][1]=a[i]\)(替换次大),可以异或的y值为\(a[i]\) xor \(a[i...j-1]\)。
- 否则,那么\(f[i][j][0]=f[i][j-1][0]\)、\(f[i][j][1]=f[i][j-1][1]\),可以异或的y值为\(f[i][j][1]\) xor \(a[i]\)(剩下的异或已经处理一遍了)。
但是,这道题N的范围是50000,开\(f[50000][50000][2]\)空间肯定会炸。
考虑到第二维度的值只是当前处理的j,可以使用滚动数组降维。
设\(f[i][0]\)为从i(当前的j)的最大值、$f[i][1]$为从i(当前的j)的次大值。既可解决空间不足的问题。
参考代码
水过了。
#include <cstdio>
#include <cmath>
using namespace std;
int n,a[10001],f[10001][2],ans;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>f[j][0]){
f[j][1]=f[j][0];
f[j][0]=a[i];
for(int k=j;k<i;k++)ans=ans>(a[k]^a[i])?ans:a[k]^a[i];
}else if(a[i]>f[j][1]){
f[j][1]=a[i];
for(int k=j;k<i;k++)ans=ans>(a[k]^a[i])?ans:a[k]^a[i];
}else{
ans=ans>(f[j][1]^a[i])?ans:(f[j][1]^a[i]);
}
}
}
printf("%d",ans);
}
TMOOC 1969 开锁的更多相关文章
- java模拟开锁
java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...
- 4位开锁<dfs>
题意: 有一个四位密码的锁,每一位是1~9的密码,1跟9相连.并且相邻的连个密码位可以交换.每改变一位耗时1s,给出锁的当前状态和密码,求最少解锁时间. 思路: 用bfs枚举出所有相邻交换的情况,并记 ...
- hihocoder 1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- #1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- Hiho #1075: 开锁魔法III
Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...
- 为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考
http://blog.csdn.net/wojiushiwo987/article/details/8851204为什么我没有拔出钥匙 ——开 ...
- HihoCoder 1075 开锁魔法III(概率DP+组合)
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- 【树莓派智能门锁】使用脚本控制GPIO来开锁【4】
假定你已经通过此文章或者其他方式完成了树莓派的基本配置 [树莓派]RASPBIAN镜像初始化配置 我们通过VNC View连接到树莓派查看一下~ 1.更新一下基本的设置:更新一下源,把python-d ...
- hrb——开锁魔法I——————【规律】
解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...
随机推荐
- RPS/RFS/ GRO
http://www.cnhalo.net/2016/09/13/linux-gro/ GRO(Generic receive offload): 在napi poll里把小包封装成大包再递交给协议栈 ...
- setPriority()优先级
1 . 优先级表示重要程度或者紧急程度.但是能不能抢到资源也是不一定.2 . 分配优先级:反映线程的重要或紧急程度线程的优先级用1-10 表示,1的优先级最低,10的优先级最高,默认值是5 packa ...
- rbd的增量备份和恢复
前言 快照的功能一般是基于时间点做一个标记,然后在某些需要的时候,将状态恢复到标记的那个点,这个有一个前提是底层的东西没用破坏,举个简单的例子,Vmware 里面对虚拟机做了一个快照,然后做了一些系统 ...
- rbd的数据在哪里
创建一个rbd [root@mytest ~]# rbd create test1 --size 4000 查看rbd信息 [root@mytest ~]# rbd info test1 rbd im ...
- error while loading shared libraries解決方法
在linux下运行程序时,发现了error while loading shared libraries这种错误,一时间不知道解决办法,在网上搜索,终于解决了. error while loading ...
- C# 简易的串口监视上位机实现
实现上位机和下位机之间的通信,通常使用的是串口通信,接下来实现一个通过上位机和串口调试助手来完成串口通信测试. 首先创建一个WInfrom窗体应用工程文件,创建过程可参考https://www.cnb ...
- [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代
方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...
- CVE-2020-1938复现
一.漏洞描述 Tomcat是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache Tomcat服务器存在文件包含漏洞,攻击 ...
- 微信支付回调 敏感信息解密 v3 php
今天博主用了一波微信的v3版本的支付,支付成功后发现回调跟v2的完全不一样,于是去看了了一波v3的文档,发现信息是经过加密的,需要解密才能获取的到 但是最悲催的是文档上没写怎么解密的,经过了一下午的百 ...
- MyBatis学习01
1.初识MyBatis 环境说明: jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit 什么是M ...