【BZOJ】【3613】【HEOI2014】南园满地堆轻絮

思路题


   考试结束前5、6min的时候想到……但是写挂了QAQ

  其实就是(差值最大的逆序对之差+1)/2;

  找逆序对其实维护一个max直接往过扫就可以了……因为逆序对是前面的数大于后面的数……

  正确性显然?就是蛮显然的啊= =

 1 /**************************************************************
 2     Problem: 3613
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:6136 ms
 7     Memory:1272 kb
 8 ****************************************************************/
 9  
10 //Huce #6 D
11 #include<vector>
12 #include<cstdio>
13 #include<cstdlib>
14 #include<cstring>
15 #include<iostream>
16 #include<algorithm>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 using namespace std;
21  
22 int getint(){
23     int v=0,sign=1; char ch=getchar();
24     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
25     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
26     return v*sign;
27 }
28 typedef long long LL;
29 const int N=5000010,INF=~0u>>2;
30 /*******************tamplate********************/
31 LL n,sa,sb,sc,sd,a[3],MOD;
32 inline LL Fx(int x){
33     return (sa*x%MOD *x%MOD*x%MOD+sb*x%MOD*x%MOD+sc*x%MOD+sd)%MOD;
34 }
35  
36 int main(){
37 #ifndef ONLINE_JUDGE
38     freopen("D.in","r",stdin);
39 //  freopen("output.txt","w",stdout);
40 #endif
41     n=getint(); sa=getint(); sb=getint(); sc=getint(); 
42     sd=getint(); a[1]=getint(); MOD=getint(); 
43     LL mx=a[1],ans=0;
44     F(i,2,n){
45         a[i%3]=(Fx(a[(i-1)%3])+Fx(a[(i-2)%3]))%MOD;
46         ans=max(mx-a[i%3],ans);
47         mx=max(mx,a[i%3]);
48     }
49     printf("%d\n",(ans+1)/2);
50     return 0;
51 }
View Code

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

Time Limit: 50 Sec  Memory Limit: 256 MB
Submit: 158  Solved: 102
[Submit][Status][Discuss]

Description

小 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 很快就想清楚了做法,但是鉴于他还忙着写诗,
所以这个任务就交给了你。 

Input

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

 每个数据包含 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 取模。

Output

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

 

Sample Input

3 815 6901 3839 178 199 10007

Sample Output

1334

HINT

  n≤5000000 


对于 100%的数据, Sa,Sb,Sc,Sd,A[1] ≤10000, Mod≤1000000007 


样例中生成的数列为:  

199 4568 1901,此时将 4568 修改为 3234,1901 也修改为 3234 即可,代价为 1334。 

Source

[Submit][Status][Discuss]
posted @ 2015-04-22 18:24  Tunix  阅读(233)  评论(0编辑  收藏  举报