JZOJ 5231 序列问题

序列问题

Description

这里写图片描述

Data Constraint

n 5* 105 , 0 Ai 109

Solution

考虑分治。
计算( l ,r)的答案,可以由( l ,mid)+( mid + 1 ,r)+经过 mid 的序列答案贡献。
枚举左端点 p ,设mi= min ( ap ~ amid ), mx = max ( ap ~ amid )。
再找出第一个满足 max ( amid+1 ~ aq )≥ mx 的右端点 q ,以及找出第一个满足 min ( amid+1 ~ aq′′ )≤ mi 的右端点 q′′
q q′′ mid 右边分成三段,对于每一段进行分类讨论维护答案即可。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,j,l) for(i=j;i<=l;i++)
#define fd(i,j,l) for(i=j;i>=l;i--)
using namespace std;
typedef long long ll;
const ll N=520000,mo=1000000007;
ll s[N];
ll ans=0;
ll mx[N],mi[N],qx[N],qi[N],qa[N];
int n,m,j,k,l,i;
ll min(ll a,ll b)
{if(a<b)return a;else return b;}
ll max(ll a,ll b)
{if(a>b)return a;else return b;}
void ef(int l,int r)
{
    if(l==r)return;
    int mid=(l+r)/2;
    int i,j;ll k1=s[mid+1],k2=s[mid+1];
    fo(i,mid+1,r)
    {
        qx[i]=k1=max(k1,s[i]); qi[i]=k2=min(k2,s[i]);
        qa[i]=k1*k2%mo;
    }
    if(l==5)
    ans=ans;
    qa[mid]=qa[r+1]=qx[r+1]=qi[r+1]=qx[mid]=qi[mid]=0;
    fd(i,r-1,mid+1)qa[i]=(qa[i]+qa[i+1])%mo;
    fo(i,mid+2,r+1)qx[i]=(qx[i]+qx[i-1])%mo,qi[i]=(qi[i]+qi[i-1])%mo;
    k1=k2=s[mid]; ll k3,k4=mid+1,k5,k6=s[mid+1];
    k3=k4; k5=k6;
    fd(i,mid,l){
        k1=max(k1,s[i]); k2=min(k2,s[i]);
        while((k3<=r)&&(k5<k1)) k3++,k5=max(k5,s[k3]);
        while((k4<=r)&&(k6>k2)) k4++,k6=min(k6,s[k4]);
        ans=(ans+(k1*k2%mo)*(min(k3,k4)-mid-1))%mo;
        ans=(ans+qa[max(k3,k4)])%mo;
        ll an=ans;
        if(k3<k4)ans=(ans+k2*(qx[k4-1] - qx[k3-1]))%mo;
        else ans=(ans+k1*(qi[k3-1]-qi[k4-1]))%mo;
        if(ans<an)
        ans=ans;
    }
    ef(l,mid); ef(mid+1,r);
}
int main()
{
    cin>>n;
    fo(i,1,n)
    scanf("%lld",&s[i]),ans=(ans+s[i]*s[i])%mo;
    ef(1,n);
    printf("%lld",ans);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值