Round #172 (Div. 2) D. Maximum Xor Secondary——栈的高级应用消除冗余操作
2013-03-27 22:33
281 查看
题意:给出一个元素互不相同的序列,求所有子段的最大值和次大值的异或值中的最大值。
我们从最直接的方法开始考虑,枚举所有的子段:先沿着序列从前向后枚举子段的结束的位置,对于每一个结束位置,向前枚举子段开始的位置,动态更新最大值和次小值。这样的做法是O(n^2),我们再来看看冗余的操作:对于每一个结束位置,在枚举开始位置的时候,一旦枚举到开始位置的元素的值比结束位置大的时候,就可以停止枚举进入下一个开始位置了。我们可以维护一个栈:对每个结束位置上的元素,不断的比较其和栈顶元素的大小并叫栈顶元素弹出知道栈为空或栈顶元素的值大于待入栈的元素,同时计算该元素和栈顶元素的异或值,最后将其压入栈中,进入下一个结束位置。
我们从最直接的方法开始考虑,枚举所有的子段:先沿着序列从前向后枚举子段的结束的位置,对于每一个结束位置,向前枚举子段开始的位置,动态更新最大值和次小值。这样的做法是O(n^2),我们再来看看冗余的操作:对于每一个结束位置,在枚举开始位置的时候,一旦枚举到开始位置的元素的值比结束位置大的时候,就可以停止枚举进入下一个开始位置了。我们可以维护一个栈:对每个结束位置上的元素,不断的比较其和栈顶元素的大小并叫栈顶元素弹出知道栈为空或栈顶元素的值大于待入栈的元素,同时计算该元素和栈顶元素的异或值,最后将其压入栈中,进入下一个结束位置。
n = input() num = map(int, raw_input().split()) sta, res = [], -1 sta.append(num[0]) for i in range(1, n): while sta: res = (num[i] ^ sta[-1]) if (num[i] ^ sta[-1]) > res else res #print num[i], sta[-1], res if sta[-1] > num[i]: break else: sta.pop() sta.append(num[i]) print res
相关文章推荐
- JS-DOM操作应用高级(三)
- Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存
- java 数据库基本操作及ResultSet高级应用
- 学习blus老师js(5)--DOM操作应用高级
- Codeforces Round #172 (Div. 1) BMaximum Xor Secondary 单调栈
- C语言高级应用---操作linux下V4L2摄像头应用程序
- Dom操作高级应用
- JS高级应用:操作模态与非模态对话框
- 服务器集群管理框架从构思到完成(四)高级应用示例:操作远程Windows服务器的计算器
- C语言高级应用---操作linux下V4L2摄像头应用程序
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- C语言高级应用---操作linux下V4L2摄像头应用程序
- InstallShield高级应用--文件操作
- JavaScrip高级应用:操作模态与非模态对话框
- mongodb高级操作及在Java企业级开发中的应用
- JS-DOM操作应用高级(二)
- 智能社JavaScript学习笔记——13/14 - DOM操作应用 - 高级
- C#字符串和正则表达式..[.net的应用]..字符串操作高级技术
- C语言高级应用---操作linux下V4L2摄像头应用程序【转】
- Codeforces Round #172 (Div. 2)