NC20012 [HEOI2014]南园满地堆轻絮

题目

题目描述

小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者,最近他研究起了诗词音律的问题。

在过去,诗词是需要编成曲子唱出来的,比如下面这首《菩萨蛮》,唱出来的话其对应的音符就是这样的:

南 园 满 地 堆 轻 絮, 愁 闻 一 霎 清 明 雨

1 1 5 5 6 6 5 4 4 3 3 2 2 1

因而可以发现,“1 1 5 5 6 6 5 4 4 3 3 2 2 1”这串音符就成为了研究音律的关键。

小Z翻阅了众多史料发现,过去的一首曲子的音调是不下降的

小Z想要知道对于一首给定的曲子,如何通过提高音调或者降低音调,将它的音调修改的不下降,而且使得修改幅度最大的那个音符的修改幅度尽量小。

即如果把一个包含 n 个音 符的曲子看做是一个正整数数列 A[1]…A[n],那么 目标是求另一个正整数数列 B[1]…B[n], 使得对于任意的 1 ≤ i < n 有 B[i] ≤ B[i+1],而且使得 Ans = Max{|A[j]-B[j]|,1 ≤ j ≤ n}尽量小。

小 Z 很快就想清楚了做法,但是鉴于他还忙着写诗,所以这个任务就交给了你。

输入描述

由于数据规模可能较大,因此采用如下方式生成数据。

每个数据包含6个数:n,Sa,Sb,Sc,Sd,A[1],Mod,意为共有 n 个音符,第一个音符为 A[1]

生成规则如下:

定义生成函数F(x) = Sa*x^3 + Sb*x^2 + Sc*x + Sd; 那么给出递推公式A[i] = F(A[i-1]) + F(A[i-2]),此处规定A[0]=0.

由于中间过程的数可能会特别大,所以要求每一步与A中的每个数都对一个给定的数 Mod 取模。

输出描述

输出一行,包含一个正整数 Ans。

示例1

输入

3 815 6901 3839 178 199 10007

输出

1334

备注

对于 \(10\%\) 的数据, \(n \le 3\)

对于 \(20\%\) 的数据, \(n \le 10\)

对于 \(30\%\) 的数据, \(n \le 100\)

对于 \(50\%\) 的数据, \(n \le 1000\)

对于 \(70\%\) 的数据, \(n \le 100000\)

对于 \(100\%\) 的数据, \(n \le 5000000,S_a,S_b,S_c,S_d,A[1] \le 10000,Mod \le 1000000007\)

题解

思路

知识点:二分。

很显然二分答案,二分一个阈值范围。

注意到需要不减,那么前一个点高度越低越好,给后面的点留足高度。

那么第一个节点直接到最低 \(A[1] - mid\),后面第 \(i\) 个节点如果 \(A[i] < A[i-1]\) ,则把 \(A[i]\) 提升到与 \(A[i-1]\) 相等为了最低限度满足条件 ,如果最后还是 \(A[i] + mid < A[i-1]\) 说明不可行,否则通过;如果 \(A[i] \geq A[i-1]\) ,则把 \(A[i]\) 降低到与 \(A[i-1]\) 相等为了给后面留空间,但可能降低不到,所以 \(A[i] = max(A[i]-mid,A[i-1])\) 。

最后如果循环结束没有跳出,就是可行方案。

为了不修改 \(A[i]\) ,用 \(pre\) 保存上一个点数据。

时间复杂度 \(O(n \log Mod)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int n, a[5000007], s[4], mod;

int f(int x) {
return (1LL * s[0] * x % mod * x % mod * x % mod +
1LL * s[1] * x % mod * x % mod +
1LL * s[2] * x % mod +
s[3]) % mod;
} bool check(int mid) {
int pre = 1 << 31;
for (int i = 1;i <= n;i++) {
if (a[i] >= pre) pre = max(pre, a[i] - mid);
else if (a[i] + mid < pre) return 0;
}
return 1;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> s[0] >> s[1] >> s[2] >> s[3] >> a[1] >> mod;
for (int i = 2;i <= n;i++)
a[i] = (f(a[i - 1]) + f(a[i - 2])) % mod; int l = 0, r = mod;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << l << '\n';
return 0;
}

NC20012 [HEOI2014]南园满地堆轻絮的更多相关文章

  1. BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案

    BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...

  2. 【BZOJ3613】[HEOI2014]南园满地堆轻絮(贪心)

    [BZOJ3613][HEOI2014]南园满地堆轻絮(贪心) 题面 BZOJ 洛谷 题解 考虑二分的做法,每次二分一个答案,那么就会让所有的值尽可能的减少,那么\(O(n)\)扫一遍就好了. 考虑如 ...

  3. 3613: [Heoi2014]南园满地堆轻絮

    3613: [Heoi2014]南园满地堆轻絮 Time Limit: 50 Sec Memory Limit: 256 MB Submit: 827 Solved: 534 [Submit][Sta ...

  4. [HEOI2014]南园满地堆轻絮

    [HEOI2014]南园满地堆轻絮 BZOJ luogu 二分答案贪心check 首先b[1]最小一定优 之后就贪心的最小化b[i]就行 #include<bits/stdc++.h> u ...

  5. [luogu] P4105 [HEOI2014]南园满地堆轻絮 (贪心)

    P4105 [HEOI2014]南园满地堆轻絮 题目描述 小 Z 是 ZRP(Zombies' Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者,最近 他研究起了诗词音律的问题. ...

  6. [BZOJ3613][Heoi2014]南园满地堆轻絮 二分答案

    Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者,最近 他研究起了诗词音律的问题.   在过去,诗词是需要编成曲子唱 ...

  7. BZOJ3613: [Heoi2014]南园满地堆轻絮

    分析: 构造数据时间有些长,可以用秦九韶优化一下. 二分答案+贪心,即:另每一个b[i]尽可能的小的同时满足题意,在枚举过程中,判断是否存在一个b[i-1]>a[i]+x 如果存在,那么向右找 ...

  8. BZOJ 3613: [Heoi2014]南园满地堆轻絮(二分)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=3613 题解: 考虑前面的数越小答案越优秀,于是我们二分答案,判断时让前面的数达到所能达到的 ...

  9. 2018.07.22 bzoj3613: [Heoi2014]南园满地堆轻絮(逆序对结论题)

    传送门 做这道题有一个显然的结论,就是要使这个数列单调不减,就要使所有逆序对保证单调不减,也就是求出所有逆序对的最大差值,然后除以2然后就没了. 代码如下: #include<bits/stdc ...

随机推荐

  1. python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)

    day13 --------------------------------------------------------------- 实例021:猴子偷桃 题目 猴子吃桃问题:猴子第一天摘下若干 ...

  2. PostgreSQL 锁 之 关系级锁

    1.关于锁的基本信息 PostgreSQL 有各种各样的技术来锁定某些东西(或者至少是这样称呼的).因此,我将首先用最笼统的术语解释为什么需要锁,可用的锁类型以及它们之间的区别.然后我们将弄清楚 Po ...

  3. python学习-Day26

    目录 今日内容详细 编程思想 面向过程编程 面向对象编程 类与对象 概念 类与对象的创建 先定义类 后产生对象 语法结构 如何产生对象 对象的实例化 绑定方法 今日内容详细 编程思想 面向过程编程 将 ...

  4. Red Hat牵头推进NVFS文件系统

    开源Linux 长按二维码加关注~ 上一篇:Linux中几个正则表达式的用法 由 Red Hat 工程师牵头的团队,正在为 Linux/开源社区研究名为 NVFS 的文件系统.NVFS 的目标是成为像 ...

  5. 老生常谈系列之Aop--AspectJ

    老生常谈系列之Aop--AspectJ 这篇文章的目的是大概讲解AspectJ是什么,所以这个文章会花比较长的篇幅去解释一些概念(这对于日常开发来说没一点卵用,但我就是想写),本文主要参考Aspect ...

  6. JavaScript 模块的循环加载(循环依赖问题分析)

    简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...

  7. Java线程同步操作

    synchronized 作用于对象实例:对给定对象加锁,进入同步代码前要获得给定对象的锁. 作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁. 作用于静态方法:相当于对当前类加 ...

  8. leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)

    一.题目大意 标签: 查找 https://leetcode.cn/problems/median-of-two-sorted-arrays 给定两个大小分别为 m 和 n 的正序(从小到大)数组 n ...

  9. java和.net 双语言开发框架,开源的PaaS平台

    当下,我国国内的PaaS平台正在蓬勃发展,各式各样的PaaS平台层出不穷,但万变不离其宗,一个优秀的PaaS平台总有自己独树一帜或与众不同的地方.那么,首先我们要了解下什么是PaaS平台?PaaS是( ...

  10. 五分钟搞懂POM设计模式

    转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...