Turn Off The Light HDU - 6307
题目大意
是有n个位置有灯,告诉你每个位置灯是开着的还是关着的,告诉你你的初始位置p,你可以往左或者右移动一步(在1到n的范围里移动),
并且在移动后必须按下开关(就是使当前打开的灯关上,当前未打开的灯打开),求出使得所有灯都关上的最少移动步数z[p],
求出p为1-n时所有的答案,输出sum{z[i]*i} %(1e9+7)(1<=i<=n)
首先我们看对于起点为最左边的点,我们可以贪心地往右走,就是若当前的位置为1,那么我们往右走一步再往左走一步走到原来的位置,那么此时的位置上1就变成0了,后一个位置的值取反,若是再往后走,那么后一个位置又会变为自己之前的值;若当前位置为0,就直接往右走一步。直到右边没有1了。
比如111 '1'11 ->1'0'1->'0'01->0'1'1->01'0'->0'0'0 单引号表示当前所在的位置,那么我们可以知道对于111,p=1的情况,z[p]=5
若是我们初始位置p是在中间的话,那我们可以选择先往左走到最左边的点,然后按照上面的方法再做一次,或者先走到最右边的点,重复上面的方法走,取这两种走法的最优值就是z[p]的值了。
那么我们就可以很容易地知道一个O(n^2)的做法了。(就是模拟上面说的走法)
至于怎么优化到O(n) 就是疯狂前缀和了。
我们仍先假设p为最左边的点,我们设最后一个出现的1的位置是last,那么我们需要统计的是(last-p)+2*(走到该点时为1的点的数量),那么重点就是统计在从p走到last的图中有多少个点在被走到时为1。那么我们将所有的s[i]^1以后计算前缀异或和(因为走到这个点这个点必须要改变,所以我们直接算异或1以后的前缀异或和),这就是我们需要统计的值。最后判断一下p-1点的前缀异或就可以知道我们需要累计的答案是哪一部分了。
至于p为中间的点时,我们再算s[i]的前缀异或,这样在先走到一端时,我们可以把走过的部分都取异或,然后和不变的部分拼接起来,按照和之前一样的方法计算就可以了
转载至https://blog.csdn.net/BinGoo0o0o/article/details/81190093
上面这个链接写的是思想,代码的细节这个博客写的更好 https://blog.csdn.net/qq_18869763/article/details/81193622
Turn Off The Light HDU - 6307的更多相关文章
- HDU 4869 (递推 组合数取模)
Problem Turn the pokers (HDU 4869) 题目大意 有m张牌,全为正面朝上.进行n次操作,每次可以将任意ai张反面,询问n次操作可能的状态数. 解题分析 记正面朝上为1,朝 ...
- LED Mood Light Factory-Smart Mood Light: Control System Principle
Intelligent devices have become more and more widespread in our lives. Intelligent scene lights are ...
- 2018 Multi-University Training Contest - Team 1 题解
Solved A HDU 6298 Maximum Multiple Solved B HDU 6299 Balanced Sequence Solved C HDU 6300 Triangle Pa ...
- 博客索引and题目列表
目录 笔记整理 计划 要学的东西 缺省源 要做的题 搜索 高斯消元 矩阵 排列组合 2019.7.9 2019.7.10 kmp ac自动机 2019.7.11 2019.7.15 笔记整理 1.同余 ...
- Practical oral English
1.如果你继续发烧,我就去请医生过来If your fever continues, I'll send for the doctor.2.在这么大的停车场里,我是永远都找不到我的车的I'll nev ...
- I Could Have Danced All Night
百老汇著名音乐剧<窈窕淑女(My Fair Lady)>中脍炙人口的经典歌曲. Bed, bed ,I couldn't go to bed床,床,我不能上床去 My head's too ...
- java设计模式(六) 命令模式
[命令模式]将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作. 1,定义命令接口 package com.pattern.comm ...
- HTML5播放器实例
鉴于html5Audio and video的使用,设计了一个自定义风格的播放器,除实现一些基本的默认功能之外,还实现了一些高级功能. 具体功能如下: 实现播放暂停按钮 实现静音按钮 实现音量调节滑动 ...
- 极客DIY:如何用Siri与树莓派“交互”
苹果在2014年推出的HomeKit智能家居平台的确给人眼前一亮的感觉.随着时间的推移,国外的黑客对HomeKit该逆向的逆向,结果也都汇总到了git.本着折腾到死的极客心态,从网上淘了一块树莓派进行 ...
随机推荐
- dos2unix命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/leedaning/article/details/53024290 使用git 的时候碰到git将unix换行符转换为wi ...
- 关于Python的面试题
Python语言特性 1 Python的函数参数传递 看两个例子: a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.ap ...
- eclipse异常关闭,而Tomcat然在运行解决方法
1.eclipse异常关闭,而Tomcat然在运行,再启动tomcat会出现端口冲突 解决方法:打开任务管理器,找到javaw.exe,点击关闭,就可以了
- Android如何避免OOM总结
转自:https://blog.csdn.net/ljx19900116/article/details/50037627 前面介绍了一些基础的内存管理机制以及OOM的基础知识,那么在实践操作当中,有 ...
- Nginx负载均衡配置与负载策略
原理 负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务. 应用场景 春节期间在12306网站上买过火车票的朋友应该深有体会,有时查询一张火车 ...
- js 小程序获取本周七天
data: { weekdays:['','','','','','',''] }, onLoad: function (options) { let that = this; let now ...
- vector(char*)和vector(string)
vector<char*> ch; vector<string> str; for(int i=0;i<5;i++) { char *c=fun1();//通过这个语句产 ...
- 根据端口号,利用DOS命令杀死进程
比如利用DOS命令找出占用8080端口的程序的PID 然后用DOS命令杀死该进程 kill
- 第215天:Angular---指令
指令(Directive) AngularJS 有一套完整的.可扩展的.用来帮助 Web 应用开发的指令集 在 DOM 编译期间,和 HTML 关联着的指令会被检测到,并且被执行 在 AngularJ ...
- MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题
问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: 1 2 3 4 5 6 7 +-------+----------+------+-----+ ...