参考:https://blog.csdn.net/lych_cys/article/details/51203960

真的不擅长这种……

分治,对于一个(l,r),先递归求出(l,mid),(mid+1,r),然后这个区间对答案贡献的就是经过mid的区间

我们先预处理出mid为l的右端点的mx*mn*len的前缀和与mx*mn的前缀和,然后枚举左端点,右端点维护两个下标j,k,分别表示mn和mx在左端点时的合法右端点

然后分三种情况处理,假设j<k

1.右端点在(mid+1,j)时,直接计算

2.右端点在(j,k)时,相当于最小值在j,最大值在(j,k),预处理一个前缀和来计算

3.右端点在(k,r)时,直接用预处理的前缀和处理,要减去右端点在(mid+1,j)时的情况

#include<iostream>
#include<cstdio>
using namespace std;
const int N=500005,mod=1e9;
int n,ans,a[N],c[N][2],f[N],g[N],p[N][2],q[N][2];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void jia(int &x,int y)
{
x+=y;
x>=mod?x-=mod:0;
}
void jian(int &x,int y)
{
x-=y;
x<0?x+=mod:0;
}
int clc(int x,int y)
{
return 1ll*(x+y)*(y-x+1)/2%mod;
}
void wk(int l,int r)
{
if(l==r)
{
jia(ans,1ll*a[l]*a[l]%mod);
return;
}
int mid=(l+r)>>1;
wk(l,mid);
wk(mid+1,r);
c[mid][0]=c[mid][1]=a[mid];
for(int i=mid-1;i>=l;i--)
c[i][0]=min(c[i+1][0],a[i]),c[i][1]=max(c[i+1][1],a[i]);
int mn=1e9,mx=-1e9;
f[mid]=g[mid]=p[mid][0]=p[mid][1]=q[mid][0]=q[mid][1]=0;
for(int i=mid+1;i<=r;i++)
{
mn=min(mn,a[i]),mx=max(mx,a[i]);
f[i]=1ll*mn*mx%mod*(i-mid)%mod;
jia(f[i],f[i-1]);
g[i]=1ll*mn*mx%mod;
jia(g[i],g[i-1]);
p[i][0]=(p[i-1][0]+mn)%mod;
q[i][0]=(q[i-1][0]+mx)%mod;
p[i][1]=1ll*mn*(i-mid)%mod;
jia(p[i][1],p[i-1][1]);
q[i][1]=1ll*mx*(i-mid)%mod;
jia(q[i][1],q[i-1][1]);
}
for(int i=mid,j=mid,k=mid;i>=l;i--)
{
while(j<r&&c[i][0]<a[j+1])
j++;
while(k<r&&c[i][1]>a[k+1])
k++;
jia(ans,1ll*c[i][0]*c[i][1]%mod*clc(mid-i+2,min(j,k)-i+1)%mod);
jia(ans,(1ll*g[r]*(mid-i+1)+f[r])%mod);
jian(ans,(1ll*g[max(j,k)]*(mid-i+1)+f[max(j,k)])%mod);
if(j<k)
{
jia(ans,(1ll*p[k][0]*(mid-i+1)+p[k][1])%mod*c[i][1]%mod);
jian(ans,(1ll*p[j][0]*(mid-i+1)+p[j][1])%mod*c[i][1]%mod);
}
else
{
jia(ans,(1ll*q[j][0]*(mid-i+1)+q[j][1])%mod*c[i][0]%mod);
jian(ans,(1ll*q[k][0]*(mid-i+1)+q[k][1])%mod*c[i][0]%mod);
}
}
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
wk(1,n);
printf("%d\n",ans);
return 0;
}

bzoj 3745: [Coci2015]Norma【分治】的更多相关文章

  1. BZOJ 3745: [Coci2015]Norma(分治)

    题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...

  2. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  3. bzoj 3745: [Coci2015]Norma

    Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...

  4. 【刷题】BZOJ 3745 [Coci2015]Norma

    Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sam ...

  5. bzoj3745: [Coci2015]Norma 分治,单调队列

    链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...

  6. [BZOJ3745][COCI2015]Norma[分治]

    题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...

  7. 【BZOJ3745】[Coci2015]Norma cdq分治

    [BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...

  8. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

  9. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

随机推荐

  1. ngnix

    nginx的平滑重启 博客分类: nginx nginx平滑重启  在研发过程中,修改nginx的配置文件nginx.conf是很平常的事,需要重启nginx.如果我们直接reload是有一定风险的, ...

  2. 手机号码归属地查询免费api接口代码

    依据手机号码查询用户的卡类型.运营商.归属地.区域等信息. 手机归属地实体类 package org.wx.xhelper.model; /** * 手机归属地 * @author wangxw * ...

  3. Mmseg中文分词算法解析

    Mmseg中文分词算法解析 @author linjiexing 开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project.使用场景涉及搜索 ...

  4. Intel Chipsets

    http://en.wikipedia.org/wiki/Chipset Chipset From Wikipedia, the free encyclopedia     A chipset is ...

  5. wxpython中控件对键盘输入无响应的可能原因

    问题描述: 开发环境:Win7 32bit + Python2.7.6 + WxPython 3.0.1-b20140707 开发某初级CAD软件中,需要实现点击TreeCtrl控件的相应选择,实现G ...

  6. Apache Qpid Broker云

    一.     什么是Broker云 Apathe Qpid 支持Broker Federation ,也就是Broker联盟或者叫做Broker云.Broker Federation可以通过配置消息路 ...

  7. WPF DataGrid 获取选中 一行 或者 多行

    WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...

  8. 在vs2005中添加lib库的方法

    方法一:在用到lib的地方加上  //强烈推荐这种方法.#pragma    comment(lib,"libname.lib") 方法二:     点击菜单命令 “项目/属性”, ...

  9. const& 的东西

    class_name ( class_name const & source ); 是拷贝构造函数的标准声明. 它和如下声明是一个意思 class_name ( const class_nam ...

  10. 自己定义msi安装包的运行过程

    有时候我们须要在程序中运行还有一个程序的安装.这就须要我们去自己定义msi安装包的运行过程. 比方我要做一个安装管理程序,能够依据用户的选择安装不同的子产品.当用户选择了三个产品时,假设分别显示这三个 ...