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打印表格

    使用Python在终端打印表格 import prettytable table = PrettyTable(['Title1', 'Title2', 'Title3']) table.add_row ...

  2. Go 语言 结构体和方法

    @ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...

  3. clion 预编译文件的查看

    看了一圈网上也没有我能一下就能看的懂的配置教程 我就手打一篇给在用clion的同学来参考一下 本文适用于g++编译 cmake Ninja生成器 clion 默认使用的是CMAKE来构建程序 生成器用 ...

  4. Linux-ssh-key验证

    ssh登录验证方式介绍 ssh服务登录的常用验证方式 用户/口令 基于密钥 基于用户和口令登录验证 客户端发起ssh请求,服务器会把自己的公钥发送给用户 用户会根据服务器发来的公钥对密码进行加密 加密 ...

  5. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  6. 中间件漏洞之IIS

    IIS中间件漏洞 我们常见的中间件有IIS.Apache.Nginx,其中IIS中间件有什么漏洞呢? IIS 短文件名漏洞: 漏洞产生的原因是为了兼容MS-DOS程序,windows为文件名较长的文件 ...

  7. 2.Docker安装

    CentOS Docker 安装 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker.Docker 运行在CentOS 7 (64-bit)上, 要求系统为64位.Linux系统内核版 ...

  8. Elasticsearch高级之-集群搭建,数据分片

    目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...

  9. 【FAQ】申请华为运动健康服务授权的4个常见问题及解决方法

    华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,在获取用户对数据的授权后,应用可通过接口访问运动健康数据,对用户数据进行增.删.改.查等操作,为用户提供运动健康类数据服务.这 ...

  10. 如何定制.NET6.0的日志记录

    在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...