列表

详情


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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 893ms, 内存消耗: 19964K, 提交时间: 2023-01-05 11:41:58

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 5005005
using namespace std;
int n,ans,a[M];
long long Sa,Sb,Sc,Sd,mod;
int F(int x)
{
	long long re=Sd,temp=x;
	re+=Sc*temp%mod;(temp*=x)%=mod;
	re+=Sb*temp%mod;(temp*=x)%=mod;
	re+=Sa*temp%mod;
	return int(re%mod);
}
int main()
{
	int i,max_val=0;
	cin>>n>>Sa>>Sb>>Sc>>Sd>>a[1]>>mod;
	for(i=2;i<=n;i++)
		a[i]=(F(a[i-1])+F(a[i-2]))%mod;
	for(i=1;i<=n;i++)
	{
		max_val=max(max_val,a[i]);
		ans=max(ans,(max_val-a[i]+1)>>1);
	}
	cout<<ans<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 952ms, 内存消耗: 39552K, 提交时间: 2022-10-21 14:51:06

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
int a[N],mx,n,sa,sb,sc,sd,mod,res;
inline int f(int x){return (sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod;}
signed main(){
	cin>>n>>sa>>sb>>sc>>sd>>a[1]>>mod; mx=a[1];
	for(int i=2;i<=n;i++)	
		a[i]=(f(a[i-1])+f(a[i-2]))%mod,res=max(res,mx-a[i]),mx=max(mx,a[i]);
	cout<<(res+1)/2;
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 823ms, 内存消耗: 100912K, 提交时间: 2020-09-01 09:33:05

def gt():
    return list(map(int, input().split()))

n,sa,sb,sc,sd,a1,mod = gt()
sa %= mod; sb %= mod; sc %= mod; sd %=mod;

F = lambda x : (sa*pow(x,3,mod) + sb*pow(x,2,mod)+ sc*x%mod + sd)%mod
A = [0,a1%mod] + [0]*(n-1)
lmax = A.copy()
ans = 0
for i in range(2, n+1):
    A[i] = (F(A[i-1])+F(A[i-2]))%mod
    lmax[i] = max(A[i],lmax[i-1])
    ans = max(ans, lmax[i]-A[i]+1>>1)

print(ans)

上一题