D. The Best Vacation(贪心+前缀和+二分)
The Best Vacation
思路
前缀和加贪心
贪心:我们的结尾点一定是在某一个月的最后一天。
贪心部分证明:我们选定两组数
A=an−2,an−1,an,b1,b2,b3……bn−2,bn−1A = a_{n - 2}, a_{n - 1}, a_{n}, b_{1}, b_{2}, b_{3}……b_{n - 2}, b_{n - 1}A=an−2,an−1,an,b1,b2,b3……bn−2,bn−1
B=an−1,an,b1,b2,b3……bn−2,bn−1,bnB = a_{n - 1}, a_{n}, b_{1}, b_{2}, b_{3}……b_{n - 2}, b_{n - 1}, b_{n}B=an−1,an,b1,b2,b3……bn−2,bn−1,bn
假如我们的贪心策略是正确的,只需要证明bn>an−2b_{n} > a_{n - 2}bn>an−2即可,但是我们总能如愿吗,看一组样例。
2 4
5 21 2 3 4 5 1 2chose 3 4 5 1
chose 4 5 1 2显然这里贪心策略错了
ans 2 3 4 5
但是我们能看到的是这组样例的却也是以某一个月的最后一天结尾。
我们列出a,ba, ba,b两个月的每天来。
a1,a2,a3,……,an−2,an−1,ana_{1}, a_{2}, a_{3}, ……, a_{n - 2}, a_{n - 1}, a_{n}a1,a2,a3,……,an−2,an−1,an
b1,b2,b3,……,bn−2,bn−1,bnb_{1}, b_{2}, b_{3}, ……, b_{n - 2}, b_{n - 1}, b_{n}b1,b2,b3,……,bn−2,bn−1,bn
假如bn>an−2b_{n} > a_{n - 2}bn>an−2,我们选定的两组数是一定成立的。
或者bn<an−2b_{n} < a_{n - 2}bn<an−2,同样的我们可以得到eachifrom1ton,an−i−1>bn−i+1each\ i\ from\ 1\ to\ n,a_{n - i - 1} > b_{n - i + 1}each i from 1 to n,an−i−1>bn−i+1
这里我们证明得到在上一步的贪心中,以月份aaa结尾的是正确的,否则的话我们将得到以bbb结尾的是正确的。
由此我们的贪心策略是正确的,所以我们只需要用前缀和来维护,然后通过枚举结尾点就行了。
代码
#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int N = 4e5 + 10;ll a[N], s[N], x;
int n;int main() {freopen("in.txt", "r", stdin);ios::sync_with_stdio(false);cin >> n >> x;for(int i = 1; i <= n; i++) {cin >> a[i];a[i + n] = a[i];s[i] = s[i + n] = (1 + a[i]) * a[i] / 2;}for(int i = 1; i <= n << 1; i++) a[i] += a[i - 1], s[i] += s[i - 1];ll ans = 0;for(int i = 1; i <= 2 * n; i++) {if(a[i] < x) continue;ll low = a[i] - x;int p = lower_bound(a + 1, a + 1 + 2 * n, low) - a;if(a[i] - a[p] == x) ans = max(ans, s[i] - s[p]);else {ll last = low - a[p - 1];ans = max(ans, s[i] - s[p - 1] - (1 + last) * last / 2);}}cout << ans << "\n";return 0;
}
D. The Best Vacation(贪心+前缀和+二分)相关推荐
- HDU 6406 Taotao Picks Apples(前缀和+二分)
HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- poj3061尺取法/前缀和 二分(java)
今天遇到这题因为以前没见到过,当时就是想着应该有着一个很简单的方法可以过但是奈何就是没思路.后来看了别人思路写了下来.学习了尺取法 poj3061 题目介绍: Description A sequen ...
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- LeetCode 528. 按权重随机选择(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...
- LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点. 提示: 整数点是具有整数坐标的点. 矩形周边上 ...
- 均分纸牌问题——(分治 + 贪心 + 前缀和 + 中位数 + 排序)
题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七 ...
- Glider(前缀和+二分)
题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...
- 209 长度最小的子数组(前缀和+二分查找、滑动窗口)
1. 问题描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = ...
- leetcode:1838. 最高频元素的频数【排序 + 前缀和 + 二分 + 思维】
分析 由于只能通过加得到某个频数 因为求的是频数,所以二分频数 频数也作为自变量,而最少操作次数成为了因变量 问题的关键就是在给定频数的情况下,求出最少操作数 因为频数越大的话,最少操作数肯定是越大的 ...
最新文章
- 性能调优-SQL TRACE
- Netty之粘包问题解决
- 16、用VS2005调试编译驱动程序
- python利用集合的无重复性_python集合?
- AcWing - 165 小猫爬山(dfs)
- php的浏览历史怎么做,php浏览历史记录的方法
- Hadoop2之NameNode HA详解
- 海量数据持久层解决方案_爱数AnyBackup重磅发布海量非结构化数据超可用解决方案...
- Jenkins高级篇之Pipeline方法篇-Pipeline Basic Steps-6-写文件writeFile和git SCM
- 如何在微软的下载商店找到下载的图片?
- The7强大多功能模板Var9.16.0+基于WordPress
- Footer置于页面底部的技巧
- 英语自然拼读法基本规则和小窍门
- 一些调格式的经验 插入图注和尾注
- Python备份Mysql脚本_python备份mysql脚本
- 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
- 万字篇:2020Android面经,历时一个半月,斩获3个大厂offer(京东、新浪、滴滴)
- 马斯克与SEC再次寻求法庭延长期限 以解决马斯克使用推特纷争
- 秋色园QBlog技术原理解析:系列终结篇:最后的AOP策略(十九)
- 2022N1叉车司机考试题库及模拟考试
热门文章
- java语言中的浮点型数据分为,Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为float型和double型,其中dou...
- 一个浪漫又悲情的爱情故事...
- 老大爷的手法一看就不一般!
- 电影院为何有散落的青瓜?
- 有趣的物理照片,让你瞬间爱上物理!
- 超好用的27个谷歌Chrome浏览器使用技巧
- python静态变量和静态方法_python的静态成员变量、实例成员变量、静态方法、类方法、实例方法...
- html试题及答案,HTML试题及答案
- oracle 查看用户状态,Oracle数据库查看用户状态
- java父类转子类_java中什么是继承,和继承的接口的关系?