1. 程式人生 > >2018.11.09【HEOI2014】【BZOJ3631】【洛谷P4105】南園滿地堆輕絮(逆序對)(規律題)

2018.11.09【HEOI2014】【BZOJ3631】【洛谷P4105】南園滿地堆輕絮(逆序對)(規律題)

BZOJ傳送門

洛谷傳送門


解析:

這個一說結論都會做,而且應該看了結論都知道怎麼證明,蒟蒻就不BB了。

結論就是差值最大的逆序對的差值的一半向上取整就是答案。


程式碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const

inline ll getint(){
    ll num=0;
    bool f=
1; char c=gc(); for(;!isdigit(c);c=gc())if(c=='-'){f=0;c=gc();break;} for(;isdigit(c);c=gc())num=(num<<1)+(num<<3)+(c^48); return f?num:-num; } inline void outint(ll a){ static char ch[23]; if(a<0)pc('-'),a=-a; do{ch[++ch[0]]=(a-a/10*10)^48;a/=10;}while(a); while
(ch[0])pc(ch[ch[0]--]); } inline bool ckmax(ll &a,const ll &b){ return a>b?(1):(a=b,0); } ll A[5000002],maxn; ll n,sa,sb,sc,sd; ll mod; inline ll F(const ll &x){return ((sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod);} ll ans=0; int main(){ n=getint(); sa=getint(); sb=
getint(); sc=getint(); sd=getint(); A[1]=getint(); mod=getint(); for(int re i=2;i<=n;++i){ A[i]=(F(A[i-1])+F(A[i-2]))%mod; } maxn=A[1]; for(int re i=2;i<=n;++i){ ckmax(maxn,A[i]); ckmax(ans,maxn-A[i]); } outint((ans+1)>>1); return 0; }